背景
C++中的順序容器是一種用于存儲(chǔ)和管理元素序列的數(shù)據(jù)結(jié)構(gòu)。它們提供了一組有序的元素,并支持在序列的任意位置插入和刪除元素。C++標(biāo)準(zhǔn)庫(kù)中提供了多種順序容器,包括vector、deque、list、forward_list和array。
vector
vector是一種動(dòng)態(tài)數(shù)組,它可以在序列的末尾快速添加和刪除元素。vector的元素在內(nèi)存中是連續(xù)存儲(chǔ)的,因此可以通過(guò)指針訪問(wèn)元素,也可以使用迭代器遍歷元素。vector的大小可以動(dòng)態(tài)調(diào)整,但是在插入或刪除元素時(shí)可能需要重新分配內(nèi)存,因此可能會(huì)導(dǎo)致性能問(wèn)題。以下是vector的一些常規(guī)操作:
- push_back:在序列的末尾添加一個(gè)元素。傳入參數(shù)為要添加的元素。
- pop_back:從序列的末尾刪除一個(gè)元素。無(wú)需傳入?yún)?shù)。
- insert:在序列的任意位置插入一個(gè)元素。傳入?yún)?shù)為插入位置的迭代器和要插入的元素。
- erase:從序列的任意位置刪除一個(gè)元素。傳入?yún)?shù)為要?jiǎng)h除元素的迭代器。
- size:返回序列中元素的數(shù)量。無(wú)需傳入?yún)?shù)。
- empty:檢查序列是否為空。無(wú)需傳入?yún)?shù)。
- clear:刪除序列中的所有元素。無(wú)需傳入?yún)?shù)。 以下是一個(gè)使用vector存儲(chǔ)整數(shù)的例子:
#include
#include
int main() {
std::vector<int> v = {1, 2, 3, 4, 5};
v.push_back(6);
v.pop_back();
auto it = v.begin();
std::advance(it, 2);
v.insert(it, 7);
it = v.begin();
std::advance(it, 4);
v.erase(it);
for (auto i : v) {
std::cout << i << " ";
}
std::cout << std::endl;
return 0;
}
在這里,我們使用vector存儲(chǔ)整數(shù),并在序列的末尾添加和刪除元素,以及在序列的任意位置插入和刪除元素。我們使用push_back函數(shù)在序列的末尾添加一個(gè)元素,使用pop_back函數(shù)從序列的末尾刪除一個(gè)元素,使用begin函數(shù)獲取vector的迭代器,并使用advance函數(shù)將迭代器移動(dòng)到指定位置,然后使用insert函數(shù)在指定位置插入一個(gè)元素,使用erase函數(shù)從指定位置刪除一個(gè)元素。最后,我們使用循環(huán)遍歷vector中的元素,并將它們打印到控制臺(tái)上。
deque
deque是一種雙端隊(duì)列,它可以在序列的兩端快速添加和刪除元素。deque的元素在內(nèi)存中不一定是連續(xù)存儲(chǔ)的,因此不能使用指針訪問(wèn)元素,但是可以使用迭代器遍歷元素。deque的大小可以動(dòng)態(tài)調(diào)整,但是在插入或刪除元素時(shí)可能需要重新分配內(nèi)存,因此可能會(huì)導(dǎo)致性能問(wèn)題。以下是deque的一些常規(guī)操作:
- push_front:在序列的前面添加一個(gè)元素。傳入?yún)?shù)為要添加的元素。
- push_back:在序列的后面添加一個(gè)元素。傳入?yún)?shù)為要添加的元素。
- pop_front:從序列的前面刪除一個(gè)元素。無(wú)需傳入?yún)?shù)。
- pop_back:從序列的后面刪除一個(gè)元素。無(wú)需傳入?yún)?shù)。
- insert:在序列的任意位置插入一個(gè)元素。傳入?yún)?shù)為插入位置的迭代器和要插入的元素。
- erase:從序列的任意位置刪除一個(gè)元素。傳入?yún)?shù)為要?jiǎng)h除元素的迭代器。
- size:返回序列中元素的數(shù)量。無(wú)需傳入?yún)?shù)。
- empty:檢查序列是否為空。無(wú)需傳入?yún)?shù)。
- clear:刪除序列中的所有元素。無(wú)需傳入?yún)?shù)。 以下是一個(gè)使用deque存儲(chǔ)字符串的例子:
#include
#include
int main() {
std::deque
在這里,我們使用deque存儲(chǔ)字符串,并在序列的兩端添加和刪除元素,以及在序列的任意位置插入和刪除元素。我們使用push_front函數(shù)在序列的前面添加一個(gè)元素,使用push_back函數(shù)在序列的后面添加一個(gè)元素,使用pop_front函數(shù)從序列的前面刪除一個(gè)元素,使用pop_back函數(shù)從序列的后面刪除一個(gè)元素,使用begin函數(shù)獲取deque的迭代器,并使用advance函數(shù)將迭代器移動(dòng)到指定位置,然后使用insert函數(shù)在指定位置插入一個(gè)元素,使用erase函數(shù)從指定位置刪除一個(gè)元素。最后,我們使用循環(huán)遍歷deque中的元素,并將它們打印到控制臺(tái)上。
list
list是一種雙向鏈表,它可以在序列的任意位置快速添加和刪除元素。list的元素在內(nèi)存中不一定是連續(xù)存儲(chǔ)的,因此不能使用指針訪問(wèn)元素,但是可以使用迭代器遍歷元素。list的大小可以動(dòng)態(tài)調(diào)整,但是在插入或刪除元素時(shí)不需要重新分配內(nèi)存,因此不會(huì)導(dǎo)致性能問(wèn)題。
以下是list的一些常規(guī)操作:
- push_front:在序列的前面添加一個(gè)元素。傳入?yún)?shù)為要添加的元素。
- push_back:在序列的后面添加一個(gè)元素。傳入?yún)?shù)為要添加的元素。
- insert:在序列的任意位置插入一個(gè)元素。傳入?yún)?shù)為插入位置的迭代器和要插入的元素。
- erase:從序列的任意位置刪除一個(gè)元素。傳入?yún)?shù)為要?jiǎng)h除元素的迭代器。
- size:返回序列中元素的數(shù)量。無(wú)需傳入?yún)?shù)。
- empty:檢查序列是否為空。無(wú)需傳入?yún)?shù)。
- clear:刪除序列中的所有元素。無(wú)需傳入?yún)?shù)。 以下是一個(gè)使用list存儲(chǔ)浮點(diǎn)數(shù)的例子:
#include
#include
int main() {
std::list<double> l = {1.1, 2.2, 3.3, 4.4, 5.5};
l.push_front(0.0);
l.push_back(6.6);
auto it = l.begin();
std::advance(it, 2);
l.insert(it, 2.0);
it = l.begin();
std::advance(it, 4);
l.erase(it);
for (auto d : l) {
std::cout << d << " ";
}
std::cout << std::endl;
return 0;
}
在這里,我們使用list存儲(chǔ)浮點(diǎn)數(shù),并在序列的任意位置添加和刪除元素。我們使用push_front函數(shù)在序列的前面添加一個(gè)元素,使用push_back函數(shù)在序列的后面添加一個(gè)元素,使用begin函數(shù)獲取list的迭代器,并使用advance函數(shù)將迭代器移動(dòng)到指定位置,然后使用insert函數(shù)在指定位置插入一個(gè)元素,使用erase函數(shù)從指定位置刪除一個(gè)元素。最后,我們使用循環(huán)遍歷list中的元素,并將它們打印到控制臺(tái)上。
forward_list
forward_list是一種單向鏈表,它可以在序列的任意位置快速添加和刪除元素。forward_list的元素在內(nèi)存中不一定是連續(xù)存儲(chǔ)的,因此不能使用指針訪問(wèn)元素,但是可以使用迭代器遍歷元素。forward_list的大小可以動(dòng)態(tài)調(diào)整,但是在插入或刪除元素時(shí)不需要重新分配內(nèi)存,因此不會(huì)導(dǎo)致性能問(wèn)題。以下是forward_list的一些常規(guī)操作:
- push_front:在序列的前面添加一個(gè)元素。傳入?yún)?shù)為要添加的元素。
- insert_after:在序列的任意位置插入一個(gè)元素。傳入?yún)?shù)為插入位置的迭代器和要插入的元素。
- erase_after:從序列的任意位置刪除一個(gè)元素。傳入?yún)?shù)為要?jiǎng)h除元素的前一個(gè)元素的迭代器。
- size:返回序列中元素的數(shù)量。無(wú)需傳入?yún)?shù)。
- empty:檢查序列是否為空。無(wú)需傳入?yún)?shù)。
- clear:刪除序列中的所有元素。無(wú)需傳入?yún)?shù)。 以下是一個(gè)使用forward_list存儲(chǔ)整數(shù)的例子:
#include
#include
int main() {
std::forward_list<int> fl = {1, 2, 3, 4, 5};
fl.push_front(0);
auto it = fl.before_begin();
std::advance(it, 2);
fl.insert_after(it, 2);
it = fl.before_begin();
std::advance(it, 4);
fl.erase_after(it);
for (auto i : fl) {
std::cout << i << " ";
}
std::cout << std::endl;
return 0;
}
在這里,我們使用forward_list存儲(chǔ)整數(shù),并在序列的任意位置添加和刪除元素。我們使用push_front函數(shù)在序列的前面添加一個(gè)元素,使用before_begin函數(shù)獲取forward_list的前向迭代器,并使用advance函數(shù)將迭代器移動(dòng)到指定位置的前一個(gè)位置,然后使用insert_after函數(shù)在指定位置插入一個(gè)元素,使用erase_after函數(shù)從指定位置刪除一個(gè)元素。最后,我們使用循環(huán)遍歷forward_list中的元素,并將它們打印到控制臺(tái)上。
array
rray是一種固定大小的數(shù)組,它可以快速訪問(wèn)元素。array的元素在內(nèi)存中是連續(xù)存儲(chǔ)的,因此可以通過(guò)指針訪問(wèn)元素,也可以使用迭代器遍歷元素。array的大小是固定的,因此不能動(dòng)態(tài)調(diào)整大小。
以下是array的一些常規(guī)操作:
- at:訪問(wèn)指定位置的元素。傳入?yún)?shù)為元素的索引。
- operator[]:訪問(wèn)指定位置的元素。傳入?yún)?shù)為元素的索引。
- front:訪問(wèn)序列的第一個(gè)元素。無(wú)需傳入?yún)?shù)。
- back:訪問(wèn)序列的最后一個(gè)元素。無(wú)需傳入?yún)?shù)。
- size:返回序列中元素的數(shù)量。無(wú)需傳入?yún)?shù)。
- empty:檢查序列是否為空。無(wú)需傳入?yún)?shù)。
以下是一個(gè)使用array存儲(chǔ)字符的例子:
#include
#include
int main() {
std::array<char, 5> a = {'h', 'e', 'l', 'l', 'o'};
std::cout << a.at(0) << " ";
std::cout << a[1] << " ";
std::cout << a.front() << " ";
std::cout << a.back() << " ";
std::cout << a.size() << " ";
std::cout << std::boolalpha << a.empty() << std::endl;
return 0;
}
在這里,我們使用array存儲(chǔ)字符,并訪問(wèn)序列的元素。我們使用at函數(shù)和operator[]運(yùn)算符訪問(wèn)指定位置的元素,使用front函數(shù)和back函數(shù)訪問(wèn)序列的第一個(gè)元素和最后一個(gè)元素,使用size函數(shù)返回序列中元素的數(shù)量,使用empty函數(shù)檢查序列是否為空。最后,我們將訪問(wèn)到的元素和序列的信息打印到控制臺(tái)上。
最后
在實(shí)際編程中,我們需要根據(jù)不同的需求選擇合適的順序容器。例如,如果需要快速在序列的末尾添加和刪除元素,可以選擇vector;如果需要快速在序列的兩端添加和刪除元素,可以選擇deque;如果需要快速在序列的任意位置添加和刪除元素,可以選擇list或forward_list;如果需要快速訪問(wèn)元素,可以選擇array。在選擇容器時(shí),需要考慮容器的特點(diǎn)、用法和性能,以便選擇最合適的容器。
-
C++
+關(guān)注
關(guān)注
21文章
2100瀏覽量
73453 -
數(shù)據(jù)結(jié)構(gòu)
+關(guān)注
關(guān)注
3文章
569瀏覽量
40072 -
Vector
+關(guān)注
關(guān)注
3文章
54瀏覽量
8541
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論