欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

c/c++ 标准容器 forward_list resize 操作

程序员文章站 2022-06-28 10:35:37
c/c++ 标准容器 forward_list, resize, 重新定位迭代器 1,forward_list特有的方法: + insert_after + emplace_after + erase_after 2,容器的插入删除操作后的注意事项 + 必须保证每次改变容器的操作后都正确地重新定位迭 ......

c/c++ 标准容器 forward_list, resize, 重新定位迭代器

1,forward_list特有的方法:

  • insert_after
  • emplace_after
  • erase_after

2,容器的插入删除操作后的注意事项

  • 必须保证每次改变容器的操作后都正确地重新定位迭代器。
  • 如果在循环中插入/删除deque,vector,string中的元素,不要缓存end返回的迭代器。

知识点

1,forward_list容器的使用,对应代码里的test1

2,resize的使用,对应代码里的test2

3,容器的插入删除操作后的注意事项,对应代码里的test3

#include <iostream>
#include <vector>
#include <string>
#include <list>
#include <forward_list>
#include <deque>

using namespace std;

int main(){
  //test1 forward_list容器的使用                                                
  //insert_after,emplace_after,erase_after                                      
  /*                                                                            
  forward_list<int> fl{0,1,2,3,4,5};                                            
  //返回头迭代器                                                                
  auto head = fl.before_begin();                                                
  //在head的后面插入6,并返回指向6的迭代器,第一个元素是6                        
  auto it = fl.insert_after(head, 6);                                           
  cout << *it << endl;                                                          
  for(auto s : fl){                                                             
    cout << s << " ";                                                           
  }                                                                             
  cout << endl;                                                                 
  auto it1 = fl.erase_after(it);                                                
  cout << *it1 << endl;                                                         
  for(auto s : fl){                                                             
    cout << s << " ";                                                           
  }                                                                             
  cout << endl;                                                                 
  fl.pop_front();                                                               
  for(auto s : fl){                                                             
    cout << s << " ";                                                           
  }                                                                             
  cout << endl;                                                                 
  */

  //test2 resize                                                                
  //如果当前容器的大小大于所要求的大小,容器后部的元素会被删除;                
  //如果当前容器的大小小于所要去的大小,会讲新元素添加到容器的后部    
  /*          
  list<int> li(5,11);
  cout << li.size() << endl;
  for(auto s : li){
    cout << s << " ";
  }
  cout << endl;
  li.resize(7,2);
  cout << li.size() << endl;
  for(auto s : li){
    cout << s << " ";
  }
  cout << endl;
  li.resize(3,8);//因为3小于原来容器的大小7,所以第二个参数8就被忽略了          
  cout << li.size() << endl;
  for(auto s : li){
    cout << s << " ";
  }
  cout << endl;
  */

  //test3 容器的插入删除操作可能使迭代器失效                                    
  vector<int> vi = {0,1,2,3,4,5,6,7,8,9};
  auto it = vi.begin();
  //这里每次都会重新去取得尾迭代器,不会有问题,                                
  //如果提前把end保存了的话,改变vi后,end就失效了,会死循环等                  
  while(it != vi.end()){
    //奇数的时候                                                                
    if(*it % 2){
      it = vi.insert(it, *it);
      //重新设定迭代器,让it指向下一个奇数                                      
      it += 2;
    }
    //偶数的时候                                                                
    else{
      it = vi.erase(it);
    }
  }
  for(auto s : vi){
    cout << s << " ";
  }
  cout << endl;
}

c/c++ 学习互助qq群:877684253

本人微信:xiaoshitou5854