C++初阶之一篇文章让你掌握vector(理解和使用)
温馨提示:这篇文章已超过443天没有更新,请注意相关的内容是否还可用!
vector(理解和使用)
- 1.什么是vector?
- 2.vector的使用
- 2.1 vector构造函数
- 2.2 vector迭代器(Iterators)函数
- 2.2.1 begin()
- 2.2.2 end()
- 2.2.3 rbegin()
- 2.2.4 rend()
- 2.2.5 cbegin()、cend()、crbegin()和crend() C++11
- 2.3 vector容量函数
- 2.4 vector元素访问函数
- 2.4.1 operator[]
- 2.4.2 at
- 2.4.3 front()
- 2.4.4 back()
- 2.4.5 data() C++11
- 2.5 vector增删查改函数
- 2.5.1 assign()
- 2.5.2 push_back()
- 2.5.3 pop_back()
- 2.5.4 insert()
- 2.5.5 erase()
- 2.5.6 swap()
- 2.5.7 clear()
- 2.5.8 emplace() C++11
- 2.5.9 emplace_back() C++11
- 2.5.10 vector 迭代器失效问题
- 结语
1.什么是vector?
在C++中,std::vector是标准模板库(STL)中的一种动态数组容器,它可以存储任意类型的元素,并且能够自动调整大小。std::vector提供了许多方便的成员函数,使得对数组的操作更加简单和高效。
vector声明:
template ;
这是 std::vector 的一般模板定义。它使用了两个模板参数 T 和 Alloc,其中 T 表示容器中存储的元素类型,Alloc 表示容器的内存分配器类型,默认为 std::allocator。该模板定义了一个通用的 vector 类模板,用于存储任意类型的元素。
template class vector;
这是特化版本的 std::vector,用于存储 bool 类型的元素。这是因为 C++ 中的 std::vector 不能直接存储布尔类型,而是使用了一种特殊的实现来节省空间。这个特化版本接受一个模板参数 Alloc,表示容器的内存分配器类型,但是对于 std::vector 来说,这个分配器类型实际上不会影响它的内部实现,因为 std::vector 会进行特殊优化来节省空间。
总结:
template ; 是 std::vector 的一般模板定义,用于存储任意类型的元素。
template class vector; 是特化版本的 std::vector,用于存储 bool 类型的元素。
特点和优势:
动态数组:std::vector内部实现了动态内存管理,可以根据需要自动调整存储容量,当需要添加新元素时,会自动分配更多的内存空间。
随机访问:可以通过下标或迭代器来访问元素,支持快速的随机访问。
自动扩容:当元素个数超过当前容量时,std::vector会自动重新分配更大的内存块,以便容纳更多元素。
连续存储:std::vector的元素在内存中是连续存储的,这样可以提高访问效率。
支持动态调整大小:可以使用 push_back() 和 pop_back() 方法在尾部添加或删除元素,也可以使用 resize() 方法动态调整容器大小。
与其它动态序列容器相比(deque, list and forward_list): vector在访问元素的时候更加高效,在末尾添加和删除元素相对高效。对于其它不在末尾的删除和插入操作,效率更低。比起list和forward_list统一的迭代器和引用更好
使用std::vector前需要包含头文件 ,例如:#include 。
下面是一个使用std::vector的简单示例:
#include #include int main() { std::vector vec; // 声明一个存储int类型的vector // 在vector中添加元素 vec.push_back(10); vec.push_back(20); vec.push_back(30); // 遍历vector并输出元素 for (const auto& element : vec) { std::cout //构造函数的使用顺序与上述相同: std::vector16,2,77,29}; std::vector1, 2, 3, 4}; std::vector5, 6, 7}; vec1 = vec2; // 将 vec2 的内容赋值给 vec1 std::vector1, 2, 3, 4, 5}; // 使用 begin() 获取可修改迭代器 std::vector std::cout std::vector1, 2, 3, 4, 5}; // 使用 end() 获取可修改迭代器 std::vector std::cout std::vector1, 2, 3, 4, 5}; // 使用 rbegin() 获取可修改逆向迭代器 std::vector std::cout std::vector 1, 2, 3, 4, 5 }; // 使用 rend() 获取可修改逆向迭代器的结束位置 std::vector //*rit += 1; //错误:常量逆向迭代器不允许修改元素的值 std::cout *rit += 1;// 从后往前修改每一个元素的值 std::cout std::vector1, 2, 3, 4, 5}; // 使用 cbegin() 获取常量迭代器的开始位置 std::vector std::cout std::cout std::vector1, 2, 3, 4, 5}; std::cout size_t sz; vector v.push_back(i); if (sz != v.capacity()) { sz = v.capacity(); cout TestVectorExpand(); return 0; } vector v.push_back(i); if (sz != v.capacity()) { sz = v.capacity(); cout TestVectorExpandOP(); return 0; } std::vector1, 2, 3, 4, 5}; // 修改元素 myVector[2] = 10; // 将索引 2 处的元素修改为 10 // 读取元素 std::cout std::vector1, 2, 3, 4, 5}; // 修改元素 myVector.at(2) = 10; // 将索引 2 处的元素修改为 10 // 读取元素 std::cout int value = myVector.at(10); } catch (const std::out_of_range& e) { std::cout std::vector1, 2, 3, 4, 5}; // 修改第一个元素 myVector.front() = 10; // 将第一个元素修改为 10 // 读取第一个元素 std::cout std::vector1, 2, 3, 4, 5}; // 修改最后一个元素 myVector.back() = 10; // 将最后一个元素修改为 10 // 读取最后一个元素 std::cout std::vector1, 2, 3, 4, 5}; // 获取底层存储数组的非常量指针 int* ptr = myVector.data(); // 修改底层存储数组 ptr[0] = 10; ptr[3] = 20; // 通过 const value_type* 获取底层存储数组的常量指针(适用于 const std::vector) const std::vector std::cout std::vector10, 20, 30, 40, 50}; myVector.assign(sourceVector.begin(), sourceVector.end()); // 打印容器内容 for (int num : myVector) { std::cout std::cout std::vector std::cout std::vector10, 20, 30}; std::cout std::cout std::cout std::vector1, 2, 3}; std::vector std::cout std::vector1, 2, 3}; std::vector std::cout std::vector1, 2, 3}; std::vector100, 200}; std::vector std::cout std::vector1, 2, 3, 4, 5}; std::vector std::cout std::vector1, 2, 3, 4, 5}; std::vector std::cout std::vector1, 2, 3}; std::vector4, 5, 6}; std::cout std::cout std::cout std::cout std::cout std::vector1, 2, 3, 4, 5}; std::cout std::cout std::cout public: Person(const std::string& name, int age) : name_(name), age_(age) { std::cout std::vector public: Person(const std::string& name, int age) : name_(name), age_(age) { std::cout std::vector vector 1,2,3,4,5,6 }; auto it = v.begin(); v.assign(100, 8); while (it != v.end()) { cout int a[] = { 1, 2, 3, 4 }; vector vector 1, 2, 3, 4 }; auto it = v.begin(); while (it != v.end()) { if (*it % 2 == 0) v.erase(it); ++it; } return 0; } vector 1, 2, 3, 4 }; auto it = v.begin(); while (it != v.end()) { if (*it % 2 == 0) it = v.erase(it); else ++it; } return 0; } vector 1,2,3,4,5 }; for (size_t i = 0; i


