目录
前言
主要参考
vector::size
vector::max_size
vector::resize
vector::capacity
vector::empty
vector::reserve
vector::shrink_to_fit
共勉
前言
本文将讨论STL容器vector中与迭代器相关的函数,模板参数T为int类型。
主要参考
cpluscplus.com
侯捷《STL源码剖析》
通义
vector::size
size_type size();
参数: 无
返回值: 返回vector中的元素数量, 返回一个无符号整型
功能:
- 返回vector中的元素数量。
- 这是vector中实际持有的对象数量,这并不一定等于其存储容量。
案例
#include <iostream> #include <vector> int main() { std::cout << std::endl; std::vector<int> myints; std::cout << "0. size: " << myints.size() << '\n'; // 向向量中添加 10 个元素,从 0 到 9 for (int i = 0; i < 10; i++) { myints.push_back(i); } std::cout << "1. size: " << myints.size() << '\n'; // 在向量末尾插入 10 个值为 100 的元素 myints.insert(myints.end(), 10, 100); std::cout << "2. size: " << myints.size() << '\n'; // 移除向量的最后一个元素 myints.pop_back(); std::cout << "3. size: " << myints.size() << '\n'; std::cout << std::endl; std::cout << std::endl; return 0; }
运行结果
vector::max_size
size_type max_size();
参数: 无
返回值: vector可以包含的最大的元素数. (返回一个无符号整型)
功能:
- 返回向量可以容纳的最大元素数。
- 这是由于已知系统或库实现限制而达到的容器的最大潜在大小,但容器绝不是保证能够达到该大小:在到达该大小之前仍有可能无法分配存储。
案例
#include <iostream> #include <vector> int main() { std::cout << std::endl; std::vector<int> myvector; // set some content in the vector: for (int i = 0; i < 100; i++) myvector.push_back(i); std::cout << "size: " << myvector.size() << "\n"; std::cout << "max_size: " << myvector.max_size() << "\n"; std::cout << std::endl; return 0; }
运行结果
vector::resize
void resize (size_type n)
void resize (size_type n, const value_type& val)
参数:
- n为新容器的大小, 以元素数量表示. 一个无符号整型
- val如果n大于当前容器大小,对象的内容被复制到添加的元素中。如果没有指定,则使用默认构造函数代替。
返回值: 无返回值
功能:
- 将容器调整可以包含n个元素的大小。
- 如果n小于当前容器大小,则内容减少到其前n个元素,删除超出的(并销毁它们)。
- 如果n大于当前容器大小,则通过在末尾插入所需数量的元素来扩展内容,直到达到n的大小。
- 如果val指定,则新元素作为val的副本初始化,否则,它们被值初始化。
- 如果n也大于当前容器容量,则自动重新分配已分配存储空间。请注意,此函数通过从容器中插入或删除元素而更改实际的内容。
案例
#include <iostream> #include <vector> int main() { std::cout << '\n'; std::vector<int> myvector; // set some initial content: for (int i = 1; i < 10; i++) { myvector.push_back(i); } std::cout << "myvector中初始内容: "; for (int i = 0; i < myvector.size(); i++) { std::cout << ' ' << myvector[i]; } std::cout << '\n'; std::cout << '\n'; myvector.resize(5); std::cout << "将myvector大小设置为5时: "; for (int i = 0; i < myvector.size(); i++) { std::cout << ' ' << myvector[i]; } std::cout << '\n'; std::cout << '\n'; myvector.resize(8, 100); std::cout << "将myvector大小设置为8, 并将大于原本空间的位置设置为100时: "; for (int i = 0; i < myvector.size(); i++) { std::cout << ' ' << myvector[i]; } std::cout << '\n'; std::cout << '\n'; myvector.resize(12); std::cout << "将myvector大小扩大为12时: "; for (int i = 0; i < myvector.size(); i++) { std::cout << ' ' << myvector[i]; } std::cout << '\n'; std::cout << '\n'; return 0; }
运行结果
vector::capacity
size_type capacity();
参数: 无
返回值:
向量中当前分配的存储容量大小,以它能容纳的元素个数为单位。 (返回一个无符号整型)
功能:
- 返回为向量分配的存储空间大小,以元素为单位表示。
- 此容量不一定等于向量大小。它可以相等或更大,并且额外的空间允许在插入时无需重新分配即可容纳增长。
- 请注意,该容量并不意味着对向量大小的限制。当此容量用尽并且需要更多时,
- 容器会自动扩展(重新分配其存储空间)。向量的最大尺寸由成员max_size给出理论上的上限。
案例
#include <iostream> #include <vector> int main () { std::vector<int> myvector; // 向myvector中插入5个元素: for (int i=0; i<5; i++) myvector.push_back(i); std::cout << "size: " << (int) myvector.size() << '\n'; std::cout << "capacity: " << (int) myvector.capacity() << '\n'; return 0; }
运行结果
这里可以看出当前myvector对象的大小是小于容器大小的, 因为容器在自动扩容的时候, 为了预防频繁多次扩容, 会一次性扩容较大的值, 不同的环境扩容大小可能会不一样. 所以capacity的值可能会有变化.
vector::empty
bool empty();
参数: 无
返回值: 如果容器大小为零,则为真,否则为假。(返回一个bool值)功能: 测试向量是否为空
案例#include <iostream> #include <vector> int main() { std::cout << '\n'; std::vector<int> myvector; int sum(0); for (int i = 1; i <= 10; i++) myvector.push_back(i); // 当myvector容器为空的时候跳出循环 while (!myvector.empty()) { sum += myvector.back(); myvector.pop_back(); } std::cout << "total: " << sum << '\n'; std::cout << '\n'; return 0; }
运行结果
该示例将myvector的内容初始化为数字序列(从1到10)。然后逐个弹出元素,直到为空,并计算其和。
vector::reserve
void reserve (size_type n);
参数:
n为向量的最小容量。 结果向量的容量可能等于或大于n。
size_type是一个无符号整数类型。
返回值: 无返回值
功能:
- 请求更改容量 要求向量容量至少足以包含n个元素。
- 如果n大于当前vector容量,该函数将容器重新分配其存储并增加其vector到n(或更大)。在所有其他情况下,函数调用不会导致重新分配,并且vector容量不受影响。 此功能对vector大小没有影响,也不能改变其元素。
案例
#include <iostream> #include <vector> int main() { std::cout << '\n'; std::vector<int>::size_type sz; std::vector<int> v1; sz = v1.capacity(); std::cout << "让v1扩容:\n"; for (int i = 0; i < 100; ++i) { v1.push_back(i); if (sz != v1.capacity()) { sz = v1.capacity(); std::cout << "capacity 改变: " << sz << '\n'; } } std::vector<int> v2; sz = v2.capacity(); v2.reserve(100); // this is the only difference with v1 above std::cout << "让v2扩容:\n"; for (int i = 0; i < 100; ++i) { v2.push_back(i); if (sz != v2.capacity()) { sz = v2.capacity(); std::cout << "capacity 改变: " << sz << '\n'; } } std::cout << '\n'; return 0; }
运行结果
vector::shrink_to_fit
void shrink_to_fit();
参数: 无
返回值: 无
功能:
将容器容量缩小到合适大小,这可能会导致重新分配,但不会影响容器内容大小,并且不能更改其元素。
案例:
int main() { std::cout << '\n'; std::vector<int> myvector(100); std::cout << "容器初始容量大小: " << myvector.capacity() << '\n'; std::cout << "容器初始大小: " << myvector.size() << '\n'; std::cout << '\n'; myvector.resize(10); std::cout << "重新设置后的容量大小: " << myvector.capacity() << '\n'; std::cout << "重新设置后的容器大小: " << myvector.size() << '\n'; std::cout << '\n'; myvector.shrink_to_fit(); std::cout << "调整之后的容器容量大小" << myvector.capacity() << '\n'; std::cout << "调整后的容器大小: " << myvector.size() << '\n'; std::cout << '\n'; return 0; }
运行结果
共勉
希望本文能给你带来帮助,如果有什么问题或疑问欢迎评论区和私信讨论。谢谢点赞、收藏、关注。
感谢阅读