C++中push_back,push_front,insert的用法
之前在介紹vector的初始化的時候有介紹到容器的push_back操作,push_back基本所有容器都支援,而push_front則是有的支援有的不支援。insert和push_back一樣都支援。
這裡簡單介紹一下三種不同新增元素的方式。
1.push_back
這個之前有介紹,是在容器尾部新增新的元素
-
vector<
int> arr;
-
arr.push_back(
1
);
-
arr.push_back(
2);
-
arr.push_back(
3);
這樣插入元素後容器arr內部元素分別是1,2,3
2.push_front
從字面可以看出這個函式和push_back相反,它是在容器開頭增加新的元素,因為容器特性的原因,有些不支援這個操作,比如vector,vector類似於陣列,而陣列是沒法直接在原來的記憶體空間前面再插入一塊新的空間用於儲存新的元素,而list則支援這個操作,list相當於連結串列,連結串列通過指標指向不同的記憶體空間並連線在一起,可以實現這種操作。如下:
-
list<
int> lt;
-
lt.push_front(
1);
-
lt.push_front(
2);
-
lt.push_front(
3);
這樣插入過後,lt內部元素按照順序就是3,2,1,因為是從頭部插入資料,所以後插入的在前面。相當於連結串列的頭插法操作。
3.insert
push_back用於在尾部插入資料,push_front用於在頭部插入資料,此時當然需要一個可以在任意位置插入資料的功能,insert就提供了這個功能。每個insert函式都接受一個迭代器作為其第一個引數。迭代器指出了在容器中設麼位置防止新元素,他可以指向容器中任何位置,包括容器尾部之後的下一個位置。對於不支援push_front操作的容器,可以用insert來實現,如
-
vector<
string> svc;
-
svc.insert(svc.begin(),
"front");
這個操作相當於push_front,在容器開頭新增一個新元素。
除了第一個迭代器引數之外,insert函式還可以接受更多的引數,這與容器建構函式類似,其中一個版本接受一個元素數目和一個值,他將指定數量的元素新增到指定位置之前,這些元素都按定值初始化,如:
-
vector<
int> sec{
1,
2,
3};
-
sec.insert(sec.end(),
5,
4);
//在容器尾部新增5個4,相當於整體為1,2,3,4,4,4,4,4
同時insert還可以接受一堆迭代器或一個初始化列表,將給定範圍中的元素插入到指定位置之前
-
vector<
string> v = {
"you",
"are",
"the",
"best"};
-
vector<
string> svc = {
"one"};
-
svc.insert(svc.begin(),v.end
-2,v.end());
//將v的最後兩個元素插入到svc的第一個元素之前
-
svc.insert(svc.end(),{
"this",
"is",
"the",
"end"});
//將這個初始化列表插入到svc的尾部
insert的返回值也可以有效利用,如下面這個迴圈:
-
list<
string> lst;
-
auto iter = lst.begin();
-
while(
cin>>word)
-
iter = lst.insert(iter,word);
//等價於push_front
迴圈之前將iter初始化為lst.begin(),迴圈內部,每次呼叫insert會返回剛剛讀入的string插入後的位置,即iter始終指向容器首元素,如此重複迴圈。
之前在介紹vector的初始化的時候有介紹到容器的push_back操作,push_back基本所有容器都支援,而push_front則是有的支援有的不支援。insert和push_back一樣都支援。