背景
C++中的顺序容器是一种用于存储和管理元素序列的数据结构。它们提供了一组有序的元素,并支持在序列的任意位置插入和删除元素。C++标准库中提供了多种顺序容器,包括vector、deque、list、forward_list和array。
vector
vector是一种动态数组,它可以在序列的末尾快速添加和删除元素。vector的元素在内存中是连续存储的,因此可以通过指针访问元素,也可以使用迭代器遍历元素。vector的大小可以动态调整,但是在插入或删除元素时可能需要重新分配内存,因此可能会导致性能问题。以下是vector的一些常规操作:
- push_back:在序列的末尾添加一个元素。传入参数为要添加的元素。
- pop_back:从序列的末尾删除一个元素。无需传入参数。
- insert:在序列的任意位置插入一个元素。传入参数为插入位置的迭代器和要插入的元素。
- erase:从序列的任意位置删除一个元素。传入参数为要删除元素的迭代器。
- size:返回序列中元素的数量。无需传入参数。
- empty:检查序列是否为空。无需传入参数。
- clear:删除序列中的所有元素。无需传入参数。 以下是一个使用vector存储整数的例子:
#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存储整数,并在序列的末尾添加和删除元素,以及在序列的任意位置插入和删除元素。我们使用push_back函数在序列的末尾添加一个元素,使用pop_back函数从序列的末尾删除一个元素,使用begin函数获取vector的迭代器,并使用advance函数将迭代器移动到指定位置,然后使用insert函数在指定位置插入一个元素,使用erase函数从指定位置删除一个元素。最后,我们使用循环遍历vector中的元素,并将它们打印到控制台上。
deque
deque是一种双端队列,它可以在序列的两端快速添加和删除元素。deque的元素在内存中不一定是连续存储的,因此不能使用指针访问元素,但是可以使用迭代器遍历元素。deque的大小可以动态调整,但是在插入或删除元素时可能需要重新分配内存,因此可能会导致性能问题。以下是deque的一些常规操作:
- push_front:在序列的前面添加一个元素。传入参数为要添加的元素。
- push_back:在序列的后面添加一个元素。传入参数为要添加的元素。
- pop_front:从序列的前面删除一个元素。无需传入参数。
- pop_back:从序列的后面删除一个元素。无需传入参数。
- insert:在序列的任意位置插入一个元素。传入参数为插入位置的迭代器和要插入的元素。
- erase:从序列的任意位置删除一个元素。传入参数为要删除元素的迭代器。
- size:返回序列中元素的数量。无需传入参数。
- empty:检查序列是否为空。无需传入参数。
- clear:删除序列中的所有元素。无需传入参数。 以下是一个使用deque存储字符串的例子:
#include
#include
int main() {
std::deque
在这里,我们使用deque存储字符串,并在序列的两端添加和删除元素,以及在序列的任意位置插入和删除元素。我们使用push_front函数在序列的前面添加一个元素,使用push_back函数在序列的后面添加一个元素,使用pop_front函数从序列的前面删除一个元素,使用pop_back函数从序列的后面删除一个元素,使用begin函数获取deque的迭代器,并使用advance函数将迭代器移动到指定位置,然后使用insert函数在指定位置插入一个元素,使用erase函数从指定位置删除一个元素。最后,我们使用循环遍历deque中的元素,并将它们打印到控制台上。
list
list是一种双向链表,它可以在序列的任意位置快速添加和删除元素。list的元素在内存中不一定是连续存储的,因此不能使用指针访问元素,但是可以使用迭代器遍历元素。list的大小可以动态调整,但是在插入或删除元素时不需要重新分配内存,因此不会导致性能问题。
以下是list的一些常规操作:
- push_front:在序列的前面添加一个元素。传入参数为要添加的元素。
- push_back:在序列的后面添加一个元素。传入参数为要添加的元素。
- insert:在序列的任意位置插入一个元素。传入参数为插入位置的迭代器和要插入的元素。
- erase:从序列的任意位置删除一个元素。传入参数为要删除元素的迭代器。
- size:返回序列中元素的数量。无需传入参数。
- empty:检查序列是否为空。无需传入参数。
- clear:删除序列中的所有元素。无需传入参数。 以下是一个使用list存储浮点数的例子:
#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存储浮点数,并在序列的任意位置添加和删除元素。我们使用push_front函数在序列的前面添加一个元素,使用push_back函数在序列的后面添加一个元素,使用begin函数获取list的迭代器,并使用advance函数将迭代器移动到指定位置,然后使用insert函数在指定位置插入一个元素,使用erase函数从指定位置删除一个元素。最后,我们使用循环遍历list中的元素,并将它们打印到控制台上。
forward_list
forward_list是一种单向链表,它可以在序列的任意位置快速添加和删除元素。forward_list的元素在内存中不一定是连续存储的,因此不能使用指针访问元素,但是可以使用迭代器遍历元素。forward_list的大小可以动态调整,但是在插入或删除元素时不需要重新分配内存,因此不会导致性能问题。以下是forward_list的一些常规操作:
- push_front:在序列的前面添加一个元素。传入参数为要添加的元素。
- insert_after:在序列的任意位置插入一个元素。传入参数为插入位置的迭代器和要插入的元素。
- erase_after:从序列的任意位置删除一个元素。传入参数为要删除元素的前一个元素的迭代器。
- size:返回序列中元素的数量。无需传入参数。
- empty:检查序列是否为空。无需传入参数。
- clear:删除序列中的所有元素。无需传入参数。 以下是一个使用forward_list存储整数的例子:
#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存储整数,并在序列的任意位置添加和删除元素。我们使用push_front函数在序列的前面添加一个元素,使用before_begin函数获取forward_list的前向迭代器,并使用advance函数将迭代器移动到指定位置的前一个位置,然后使用insert_after函数在指定位置插入一个元素,使用erase_after函数从指定位置删除一个元素。最后,我们使用循环遍历forward_list中的元素,并将它们打印到控制台上。
array
rray是一种固定大小的数组,它可以快速访问元素。array的元素在内存中是连续存储的,因此可以通过指针访问元素,也可以使用迭代器遍历元素。array的大小是固定的,因此不能动态调整大小。
以下是array的一些常规操作:
- at:访问指定位置的元素。传入参数为元素的索引。
- operator[]:访问指定位置的元素。传入参数为元素的索引。
- front:访问序列的第一个元素。无需传入参数。
- back:访问序列的最后一个元素。无需传入参数。
- size:返回序列中元素的数量。无需传入参数。
- empty:检查序列是否为空。无需传入参数。
以下是一个使用array存储字符的例子:
#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存储字符,并访问序列的元素。我们使用at函数和operator[]运算符访问指定位置的元素,使用front函数和back函数访问序列的第一个元素和最后一个元素,使用size函数返回序列中元素的数量,使用empty函数检查序列是否为空。最后,我们将访问到的元素和序列的信息打印到控制台上。
最后
在实际编程中,我们需要根据不同的需求选择合适的顺序容器。例如,如果需要快速在序列的末尾添加和删除元素,可以选择vector;如果需要快速在序列的两端添加和删除元素,可以选择deque;如果需要快速在序列的任意位置添加和删除元素,可以选择list或forward_list;如果需要快速访问元素,可以选择array。在选择容器时,需要考虑容器的特点、用法和性能,以便选择最合适的容器。
-
C++
+关注
关注
22文章
2108浏览量
73622 -
数据结构
+关注
关注
3文章
573浏览量
40123 -
Vector
+关注
关注
3文章
60浏览量
8594
发布评论请先 登录
相关推荐
评论