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


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM