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;
}
}