简述
array<T,N>
- 长度固定,N个T类型的对象
- 不能增加或删除元素
vector<T>
- 底层实现是封装了顺序表,是一块物理上连续的空间
- 长度可变,必要时可以自动增加容量
- 但只能在序列的末尾高效的增加或删除元素
deque<T>
- deque是由一段一段的定量连续空间构成的,一旦有必要在前端和尾端添加新空间,便配置一段定量连续空间,串联在真个deque的前端或尾端
- 它采用一块所谓的map(不是stl的map)作为主控。这个map是一小块连续空间,每个元素都是指针,指向另一端线性连续空间(缓冲区)
- STL允许我们指定缓冲区的大小,默认值0表示使用512字节的缓冲区
- 双端队列,长度可变,可以自动增长的序列
- 在序列的两端都不能高效的增加或删除元素
list<T>
- 底层实现是双向链表,节点之间通过指针展现出逻辑上的连续,在物理内存的分配上,不是连续的。
- 双向链表,长度可变
- 在任何地方都能高效的增加或删除元素
- 访问容器中的元素的速度要比前面3种都要慢,因为它只能从第一个或最后一个元素开始遍历
forward_list<T>
- 正向单链表,长度可变
- 比list更快,更节省内存的容器
- 只能从第一个元素开始访问遍历
array
1 |
std::array<double, 100> data {}; |
fill
- 将所有元素设置成传入的参数
1 |
data.fill(3.14); |
at
- 可以通过下标对array进行访问,但是使用at更安全,at对越界索引值进行了检测
size
- 返回元素个数
empty
- 空的话返回true
front
- 返回第一个元素的引用
back
- 返回最后一个元素的引用
data
- 返回
&front()
,是容器底层用来存储元素的标准数组的地址,一般不会用到
get<n>
- 模板函数,获取到容器的第n个元素,参数n必须是一个能在编译器确定的常量表达式
1 2 3 |
std::array<std::string,5> words {"one", "two", "three", "four", "five"}; std::cout << std::get<3>(words) << std::endl; |
vector
1 2 3 4 5 6 7 8 |
std::vector<double> values; // 指定值初始化 std::array<std::string,5> words {"one", "two", "three", "four", "five"}; std::vector<std::string> words_cp {std::begin(words), std::end(words)}; // 移动初始化 std::vector<std::string> words_cp_mv {std::make_move_iterator(std::begin(words)), std::make_move_iterator(std::end(words))} |
reserve
- 增加容器容量
1 |
values.reserve(20); |
size
- 元素数量
at
- 可以通过下标对vector进行访问,但是使用at更安全,at对越界索引值进行了检测
capacity
- 容器大小
front
- 返回第一个元素的引用
back
- 返回最后一个元素的引用
data
- 返回一个指向数组的指针,它在内部被用来存储元素
push_back
- 在末尾添加一个元素(生成一个对象,移动到vector中)
emplace_back
- 更高效的在末尾添加一个元素(根据传入的参数,用目标类型的构造函数生成一个对象)
insert
- 插入元素
emplace
- 在vector中插入新的元素(直接在容器中生成)
clear
- 删除所有元素
pop_back
- 删除尾部元素
shrink_to_fit
- 去掉容器的多余容量
erase
- 删除容器中的一个或多个元素
vector<bool>
- vector<T>的特化,为bool类型的元素提供了更加有效的内存使用方式
- bool值的序列通常不需要存储在连续的内存中,因此vector<bool>中没有data函数
- 直接寻址时,它们被包装成了一个字,所以front和back返回的不是bool&引用,而是一个中间对象的引用,他代表序列中第一个值和最后一个值
- 当要使用bool,并且知道要用多少个时,bitset是更好的选择
deque
1 2 3 4 5 6 7 8 9 |
std::deque<int> a_deque; // 10个元素 std::deque<int> b_deque(10); // 初始化 std::deque<std::string> words {"one", "two", "three", "four", "five"}; std::deque<std::string> words_cp {words}; std::deque<std::string> words_part { std::begin(words), std::begin(words)+5 }; |
size
- 元素数量
at
- 可以通过下标对deque进行访问,但是使用at更安全,at对越界索引值进行了检测
front
back
push_back
pop_back
push_front
pop_front
insert
emplace_front
emplace_back
assign
- 替换现有的所有元素
list
- 不能索引元素,需要一个一个遍历
1 2 3 4 5 6 7 8 9 |
std::list<std::string> words; // 20个空元素 std::list<std::string> sayings {20}; // 50个 std::list<double> values(50, 3.15); std::list<double> samp {++std::cbegin(values), --std::cend(values)}; |
push_front
- 在头部添加一个元素
push_back
- 在尾部添加一个元素
emplace_back
- 在尾部添加一个元素
insert
clear
erase
remove
- 移除和参数匹配的元素
remove_if
- 传入一个一元断言,断言返回true的所有元素都会被移除
unique
- 移除连续的重复元素,只留下其中的第一个
merge
- 以另一个相同元素类型的list容器作为参数,连个容器中的元素都必须是升序。参数list容器中的元素最后会被合并到当前list里面
splice
- 将参数list容器中的元素移动到当前容器中指定位置的前面
- 可以移动单个,一段,或全部
front
back
forward_list
- 和list的区别是,不能反向遍历元素,只能从头到尾遍历
- 无法使用反向迭代器,只能得到const或非const的前向迭代器,这些迭代器都不能解引用,只能自增
front
- 返回第一个元素的的引用
- list没有back,push_back,pop_back,emplace_back
size
- 没有size
- 只能通过distance来得到元素的个数
- 也可以使用advance来将前向迭代器自增需要的次数
1 2 3 4 5 6 |
std::forward_list<std::string> my_words {"one", "two", "three", "four", "five"}; auto count = std::distance(std::begin(my_words), std::end(my_words)); auto ite = std::begin(my_words); size_t n{3}; std::advance(ite, n); |
splice_after
insert_after
- 元素插入
sort
merge
remove
remove_if
unique
本文为原创文章,版权归Aet所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ C++标准库_cfenv02/14
- ♥ 文件md5值计算05/31
- ♥ Effective C++_第五篇07/02
- ♥ C++20_第一篇06/30
- ♥ C++20_第二篇03/21
- ♥ Boost 程序库完全开发指南:容器算法数学文件08/24