加入收藏 | 设为首页 | 会员中心 | 我要投稿 大连站长网 (https://www.0411zz.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 编程要点 > 语言 > 正文

C++ STL list增加 插入 元素方法详解

发布时间:2022-07-16 06:30:56 所属栏目:语言 来源:互联网
导读:前面章节介绍了如何创建 list 容器,在此基础上,本节继续讲解如何向现有 list 容器中添加或插入新的元素。 list 模板类中,与添加或插入新元素相关的成员方法有如下几个: push_front():向 list 容器首个元素前添加新元素; push_back():向 list 容器最
  前面章节介绍了如何创建 list 容器,在此基础上,本节继续讲解如何向现有 list 容器中添加或插入新的元素。
 
  list 模板类中,与“添加或插入新元素”相关的成员方法有如下几个:
  push_front():向 list 容器首个元素前添加新元素;
  push_back():向 list 容器最后一个元素后添加新元素;
  emplace_front():在容器首个元素前直接生成新的元素;
  emplace_back():在容器最后一个元素后直接生成新的元素;
  emplace():在容器的指定位置直接生成新的元素;
  insert():在指定位置插入新元素;
  splice():将其他 list 容器存储的多个元素添加到当前 list 容器的指定位置处。
 
  以上这些成员方法中,除了 insert() 和 splice() 方法有多种语法格式外,其它成员方法都仅有 1 种语法格式,下面程序演示了它们的具体用法。
  #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
 
  list insert()成员方法
  insert() 成员方法的语法格式有 4 种,如表 1 所示。
 
  表 1 insert() 成员方法语法格式
  语法格式 用法说明
  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 指定的位置之前,插入初始化列表(用大括号 { } 括起来的多个元素,中间有逗号隔开)中所有的元素,并返回表示第一个新插入元素位置的迭代器。
  下面的程序演示了如何使用 insert() 方法向 list 容器中插入元素。
  #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容器添加和删除元素》一节做详细了解。
 
  list splice()成员方法
  和 insert() 成员方法相比,splice() 成员方法的作用对象是其它 list 容器,其功能是将其它 list 容器中的元素添加到当前 list 容器中指定位置处。
 
  splice() 成员方法的语法格式有 3 种,如表 2 所示。
 
  表 2 splice() 成员方法的用法
  语法格式 功能
  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 指明的位置处。
  我们知道,list 容器底层使用的是链表存储结构,splice() 成员方法移动元素的方式是,将存储该元素的节点从 list 容器底层的链表中摘除,然后再链接到当前 list 容器底层的链表中。这意味着,当使用 splice() 成员方法将 x 容器中的元素添加到当前容器的同时,该元素会从 x 容器中删除。
 
  下面程序演示了 splice() 成员方法的用法:
  #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

(编辑:大连站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!