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

c/c++ 标准顺序容器 之 push_back,push_front,insert,emplace 操作

程序员文章站 2022-03-18 16:47:53
c/c++ 标准顺序容器 之 push_back,push_front,insert,emplace 操作 关键概念:向容器添加元素时,添加的是元素的拷贝,而不是对象本身。随后对容器中元素的任何改变都不会影响到原始对象,反之亦然。 关键警告:因为vector,deque,string的内存存储都是在 ......

c/c++ 标准顺序容器 之 push_back,push_front,insert,emplace 操作

关键概念:向容器添加元素时,添加的是元素的拷贝,而不是对象本身。随后对容器中元素的任何改变都不会影响到原始对象,反之亦然。

关键警告:因为vector,deque,string的内存存储都是在连续的空间上,所以向vector,deque,string的头尾以外的位置插入元素或者删除元素,会产生元素的移动,就会非常耗时,这时就应该考虑使用双向链表list,但是list不支持下标操作

知识点

1,在容器的尾部插入元素push_back,对应代码里的test1

2,在容器的头部插入元素push_front,对应代码里的test2

3,在容器的任意位置插入单个元素insert ,对应代码里的test3

4,在容器的任意位置插入多个元素insert,对应代码里的test4

5,insert返回新添加的第一个元素,对应代码里的test5

6,emplace_front,emplace,emplace_back,对应代码里的test6

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

using namespace std;

int main(){
  //test1 push_back                                                             
  //forward_list没有push_back方法                                               
  /*                                                                            
  vector<string> container;                                                     
  //list<string> container;                                                     
  //deque<string> container;                                                    
  //forward_list<string> container;//forward_list没有push_back方法              
  string word;                                                                  
  while(cin >> word){                                                           
    container.push_back(word);                                                  
  }                                                                             
  for(auto const &s : container){                                               
    cout << s << " ";                                                           
  }                                                                             
  cout << endl;                                                                 
                                                                                
  string s("abc");                                                              
  s.push_back('d');                                                             
  cout << s << endl;                                                            
  */

  //test2 push_front                                                            
  /*                                                                            
  //list<string> container;                                                     
  deque<string> container;                                                      
  string word;                                                                  
  while(cin >> word){                                                           
    container.push_front(word);                                                 
  }                                                                             
  for(auto const &s : container){                                               
    cout << s << " ";                                                           
  }                                                                             
  cout << endl;                                                                 
  */

  //test3 insert单个元素                                                        
  //vector和string虽然不支持push_front,但是支持在头部insert                    
  /*                                                                            
  //vector<string> container{"aa","bb","cc"};                                   
  //list<string> container{"aa","bb","cc"};                                     
  deque<string> container{"aa","bb","cc"};                                      
  //vector<string>::iterator it = container.begin();                            
  //list<string>::iterator it = container.begin();                              
  deque<string>::iterator it = container.begin();                               
  container.insert(++it, "ddd");                                                
  for(auto const &s : container){                                               
    cout << s << " ";                                                           
  }                                                                             
  cout << endl;                                                                 
  string str("abc");                                                            
  string::iterator it1 = str.begin();                                           
  str.insert(++it1, 'd');                                                       
  for(auto const &s : str){                                                     
    cout << s << " ";                                                           
  }                                                                             
  cout << endl;                                                                 
  */

  //test4 insert范围                                                            
  /*                                                                            
  vector<string> v{"aa","bb","cc"};                                             
  list<string> sl{"dd","ff"};                                                   
  sl.insert(sl.begin(), v.end() - 2, v.end());                                  
  for(auto const &s : sl){                                                      
    cout << s << " ";                                                           
  }                                                                             
  cout << endl;                                                                 
  sl.insert(sl.end(), {"ee","gg"});                                             
  for(auto const &s : sl){                                                      
    cout << s << " ";                                                           
  }                                                                             
  cout << endl;                                                                 
  */

  //test5 使用insert的返回值                                                   
  //插入到指定的位置之前,返回新添加的第一个元素                                 
  /*                                                                            
  list<string> sl;                                                              
  auto it = sl.begin();                                                         
  string word;                                                                  
  //下面的代码,相当于push_front                                                 
  while(cin >> word){                                                           
    it = sl.insert(it,word);                                                    
  }                                                                             
  for(auto const &s : sl){                                                      
    cout << s << " ";                                                           
  }                                                                             
  cout << endl;                                                                 
  */

  //test6 emplace_front,emplace,emplace_back                                    
  //直接在容器里构造对象                                                        
  class test{
  public:
    test(const string& d = "", int s = 2) : name(d), age(s){}
    string getname()const{
      return name;
    }
    int getage()const{
      return age;
    }
  private:
    string name;
    int age;
  };
  list<test> vc;
  vc.emplace_back("aa",10);
  vc.emplace_front("bb",12);
  vc.emplace(vc.begin(), "cc", 11);
  for(auto const &s : vc){
    cout << s.getname() << ":" << s.getage() << endl;
  }
}

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

本人微信:xiaoshitou5854