stl vector

1.构造函数


explicit vector(
   size_type _Count
);   //这个构造函数,将构造出_Count个元素,并为每个元素调用构造拷贝函数,其中构造拷贝函数的原对象就一个临时默认构造函数的对象




2.vector的迭代器实质就是元素的指针.


3.若对vector进行的删除或者添加后,迭代器可能会失效, 在调用单个erase时不能指定end








********************元素的保留机制********************


容器中的size函数是得到容器中的实际元素个数,而capacity则是得到容器中分配的元素个数,对于vector来说迭代器是跟size关联的,而下标操作则是根据capacity关联的.当进行下标操作时应该使用capacity来进行边界定。




若要提前对容器的存储容量进行指定则可以调用函数reserve来完成.这个函数的参数指定要保留的元素数量,若数量小于容器已经分配的容量则什么也不做,若数量大于分配的容量则对容器容量进行扩充.这个函数并不影响容器的size而是影响容器的capacity,同时当调用这个函数后迭代器则可能会失效(因为内存可能重新分配了),因此调用reserve后需要重新获取迭代器.


我们可以通过下标的方式来进行操作,因为下标的边界是capacity。而不是size。当我们用下标做左值时。可以见一个元素赋值给容器中。但因为这样不会增加size。同时我们使用下标做右值时可能会有危险,因为可能这个元素并没有被构造(只是分配了内存)。所以一定要注意。


******感觉这样很矛盾*******,但要注意是,我们不因该使用capacity做下标的边界就可以了!!!




4.容器操作对迭代器的影响


对容器进行添加,删除,resize, reserve等操作后迭代器可能会无效(内存的重新分配!)因此要注意!!!当使用了这些操作后不要再对原来迭代器进行使用了!






5.vector对字符串的支持(char*  wchar_t*)


vector的默认分配器并没有对字符串进行特化版本,因此容器的元素就是一个指针,这就可能会是一个栈指针,所以不应该这样使用,而是使用string类来代替字符串,当然若
vector跟字符串的生存期一样是可以了
### C++ STL Vector 的使用方法及示例 #### 1. 基本概念 `std::vector` 是 C++ 标准模板库(STL)中的一个重要组件,属于一种动态数组容器。与传统静态数组相比,`std::vector` 可以在运行时动态调整其大小[^3]。 为了使用 `std::vector`,需要包含头文件 `<vector>` 并显式实例化模板类[^2]。 #### 2. 创建和初始化 以下是创建并初始化 `std::vector` 的几种常见方式: ```cpp #include <iostream> #include <vector> int main() { // 方式一:默认构造函数 std::vector<int> v1; // 方式二:指定初始容量 std::vector<int> v2(5); // 初始化为五个0 // 方式三:指定初始值 std::vector<int> v3(5, 10); // 初始化为五个10 // 方式四:通过另一个向量初始化 std::vector<int> v4(v3); // 方式五:从数组初始化 int arr[] = {1, 2, 3}; std::vector<int> v5(arr, arr + sizeof(arr)/sizeof(int)); return 0; } ``` #### 3. 遍历元素 可以通过迭代器或者范围循环来遍历 `std::vector` 中的元素[^1]。 ```cpp #include <iostream> #include <vector> int main() { std::vector<int> vec = {1, 2, 3, 4, 5}; // 方法一:使用迭代器 for (std::vector<int>::iterator it = vec.begin(); it != vec.end(); ++it) { std::cout << *it << " "; } std::cout << std::endl; // 方法二:使用范围for循环 for (const auto& elem : vec) { std::cout << elem << " "; } return 0; } ``` #### 4. 动态调整大小 `std::vector` 支持动态扩展和收缩,常用的方法有 `push_back()`、`pop_back()`、`resize()` 和 `reserve()`[^4][^5]。 - **`push_back(value)`**: 向向量末尾添加新元素。 - **`pop_back()`**: 删除向量最后一个元素。 - **`resize(new_size)`**: 调整向量大小至 `new_size`。 - **`reserve(size)`**: 预留至少 `size` 大小的空间。 示例如下: ```cpp #include <iostream> #include <vector> int main() { std::vector<int> vec; // 添加元素 vec.push_back(1); vec.push_back(2); // 扩展大小 vec.resize(5, 0); // 将vec扩展到5个元素,默认填充为0 // 预留空间 vec.reserve(10); // 至少预留10个位置 // 移除最后元素 vec.pop_back(); for (const auto& elem : vec) { std::cout << elem << " "; } return 0; } ``` #### 5. 访问元素 可以使用索引运算符 `[ ]` 或者成员函数 `at(index)` 来访问向量中的元素。 ```cpp #include <iostream> #include <vector> int main() { std::vector<int> vec = {1, 2, 3, 4, 5}; // 使用 [] 运算符 std::cout << "First element: " << vec[0] << std::endl; // 使用 at() 函数 try { std::cout << "Third element: " << vec.at(2) << std::endl; } catch (const std::out_of_range& e) { std::cerr << "Error: " << e.what() << std::endl; } return 0; } ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值