#include <iostream> #include <list> using namespace std; int main() { std::list<int> values{1,2,3}; values.push_front(0);//{0,1,2,3} values.push_back(4); //{0,1,2,3,4} values.emplace_front(-1);//{-1,0,1,2,3,4} values.emplace_back(5); //{-1,0,1,2,3,4,5} //emplace(pos,value),其中 pos 表示指明位置的迭代器,value为要插入的元素值 values.emplace(values.end(), 6);//{-1,0,1,2,3,4,5,6} for (auto p = values.begin(); p != values.end(); ++p) { cout << *p << " "; } return 0; }输出结果为:
-1,0,1,2,3,4,5,6
语法格式 | 用法说明 |
---|---|
iterator insert(pos,elem) | 在迭代器 pos 指定的位置之前插入一个新元素 elem,并返回表示新插入元素位置的迭代器。 |
iterator insert(pos,n,elem) | 在迭代器 pos 指定的位置之前插入 n 个元素 elem,并返回表示第一个新插入元素位置的迭代器。 |
iterator insert(pos,first,last) | 在迭代器 pos 指定的位置之前,插入其他容器(例如 array、vector、deque 等)中位于 [first,last) 区域的所有元素,并返回表示第一个新插入元素位置的迭代器。 |
iterator insert(pos,initlist) | 在迭代器 pos 指定的位置之前,插入初始化列表(用大括号 { } 括起来的多个元素,中间有逗号隔开)中所有的元素,并返回表示第一个新插入元素位置的迭代器。 |
#include <iostream> #include <list> #include <array> using namespace std; int main() { std::list<int> values{ 1,2 }; //第一种格式用法 values.insert(values.begin() , 3);//{3,1,2} //第二种格式用法 values.insert(values.end(), 2, 5);//{3,1,2,5,5} //第三种格式用法 std::array<int, 3>test{ 7,8,9 }; values.insert(values.end(), test.begin(), test.end());//{3,1,2,5,5,7,8,9} //第四种格式用法 values.insert(values.end(), { 10,11 });//{3,1,2,5,5,7,8,9,10,11} for (auto p = values.begin(); p != values.end(); ++p) { cout << *p << " "; } return 0; }输出结果为:
3 1 2 5 5 7 8 9 10 11
学到这里,读者有没有发现,同样是实现插入元素的功能,无论是 push_front()、push_back() 还是 insert(),都有以 emplace 为名且功能和前者相同的成员函数。这是因为,后者是 C++ 11 标准新添加的,在大多数场景中,都可以完全替代前者实现同样的功能。更重要的是,实现同样的功能,emplace 系列方法的执行效率更高。有关 list 模板类中 emplace 系列函数执行效率更高的原因,前面在讲解 deque 容器模板类中的 emplace 系列函数时已经讲过,读者可阅读《C++ STL deque容器添加和删除元素》一节做详细了解。
语法格式 | 功能 |
---|---|
void splice (iterator position, list& x); |
position 为迭代器,用于指明插入位置;x 为另一个 list 容器。 此格式的 splice() 方法的功能是,将 x 容器中存储的所有元素全部移动当前 list 容器中 position 指明的位置处。 |
void splice (iterator position, list& x, iterator i); |
position 为迭代器,用于指明插入位置;x 为另一个 list 容器;i 也是一个迭代器,用于指向 x 容器中某个元素。 此格式的 splice() 方法的功能是将 x 容器中 i 指向的元素移动到当前容器中 position 指明的位置处。 |
void splice (iterator position, list& x, iterator first, iterator last); |
position 为迭代器,用于指明插入位置;x 为另一个 list 容器;first 和 last 都是迭代器,[fist,last) 用于指定 x 容器中的某个区域。 此格式的 splice() 方法的功能是将 x 容器 [first, last) 范围内所有的元素移动到当前容器 position 指明的位置处。 |
#include <iostream> #include <list> using namespace std; int main() { //创建并初始化 2 个 list 容器 list<int> mylist1{ 1,2,3,4 }, mylist2{10,20,30}; list<int>::iterator it = ++mylist1.begin(); //指向 mylist1 容器中的元素 2 //调用第一种语法格式 mylist1.splice(it, mylist2); // mylist1: 1 10 20 30 2 3 4 // mylist2: // it 迭代器仍然指向元素 2,只不过容器变为了 mylist1 //调用第二种语法格式,将 it 指向的元素 2 移动到 mylist2.begin() 位置处 mylist2.splice(mylist2.begin(), mylist1, it); // mylist1: 1 10 20 30 3 4 // mylist2: 2 // it 仍然指向元素 2 //调用第三种语法格式,将 [mylist1.begin(),mylist1.end())范围内的元素移动到 mylist.begin() 位置处 mylist2.splice(mylist2.begin(), mylist1, mylist1.begin(), mylist1.end());//mylist1: //mylist2:1 10 20 30 3 4 2 cout << "mylist1 包含 " << mylist1.size() << "个元素" << endl; cout << "mylist2 包含 " << mylist2.size() << "个元素" << endl; //输出 mylist2 容器中存储的数据 cout << "mylist2:"; for (auto iter = mylist2.begin(); iter != mylist2.end(); ++iter) { cout << *iter << " "; } return 0; }程序执行结果为:
mylist1 包含 0个元素
mylist2 包含 7个元素
mylist2:1 10 20 30 3 4 2
Copyright © 广州京杭网络科技有限公司 2005-2025 版权所有 粤ICP备16019765号
广州京杭网络科技有限公司 版权所有