c/c++ 標準順序容器 之 push_back,push_front,insert,emplace 操作

小石王發表於2018-09-13

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

相關文章