C++ vector容器
vector是可变数组。
容纳元素个数可以在运行期间变化。
std::vector 是 C++ 标准库中的动态数组容器,它提供了可变大小的数组功能,具有灵活性和多种强大的功能。
特点
-
动态大小: std::vector 可以根据需要动态增长或缩小,可以在运行时添加或删除元素,无需事先知道数组大小,容器内部会自动处理。
-
随时随机访问: std::vector 支持随机访问,可以使用下标运算符 [] 和
at()
方法访问元素。 -
内存管理: std::vector 会自动管理内存,当元素超出当前大小时,会自动分配更多的内存,并根据需要移动现有元素。
-
元素安全性: 使用 at() 方法时,如果访问索引超出范围,会抛出 std::out_of_range 异常,提供了一定程度的安全性。
-
迭代器支持: std::vector 提供迭代器支持,可以使用标准算法进行遍历和操作。
-
内存连续性: std::vector 内部实现为连续的内存块,使得在访问元素时比链表等其他容器更快。
第1/2段示例代码
// CMake_LeetCodeHot100.cpp: 定义应用程序的入口点。
//
#include "CMake_LeetCodeHot100.h"
#include <iostream>
#include <algorithm>
#include <vector>
#include <array>
#include <ctime>
#include <stdlib.h>
using namespace std;
#define ASIZE 100000
void test_vector() {
cout << "\ntest_vector()...\n";
vector<string> v;
char buf[10];
clock_t timeStart = clock();
for (long i = 0; i < ASIZE; ++i) {
try {
snprintf(buf,10,"%d",rand());
v.push_back(string(buf));
}
catch (exception& p) {
cout << "i=" << i << " " << p.what() << endl;
abort();
}
}
clock_t endStart = clock();
// 输出运行时间
cout << "milli-seconds : " << (endStart - timeStart) << endl;
// 输出数组元素个数
cout << "vector.size():" << v.size() << endl;
// 输出数组第一个元素
cout << "vector.front():" << v.front() << endl;
// 输出数组最后一个元素
cout << "vector.back():" << v.back() << endl;
// 输出数组首地址
cout << "vector.data():" << v.data() << endl;
// 输出数组当前总容量
cout << "vector.capacity():" << v.capacity() << endl;
}
int main()
{
test_vector();
getchar();
return 0;
}
第2/2段示例代码
// CMake_LeetCodeHot100.cpp: 定义应用程序的入口点。
//
#include "CMake_LeetCodeHot100.h"
#include <iostream>
#include <vector>
using namespace std;
int main()
{
// 创建一个整数的 vector
std::vector<int> vec;
// 添加元素
vec.push_back(1);
vec.push_back(2);
vec.push_back(3);
// 输出元素
std::cout << "Vector elements: ";
for (const auto& element : vec) {
std::cout << element << " ";
}
std::cout << std::endl;
// 访问元素
std::cout << "First element: " << vec[0] << std::endl;
std::cout << "Second element: " << vec.at(1) << std::endl;
// 移除最后一个元素
vec.pop_back();
// 原地清空全部元素
vec.clear();
// 添加新元素
vec.push_back(10);
vec.push_back(20);
// 输出大小和容量
std::cout << "Size: " << vec.size() << ", Capacity: " << vec.capacity() << std::endl;
getchar();
return 0;
}
注意事项
-
内存重新分配: 当 std::vector 的大小超过当前容量时,会分配一个新的更大的内存块,并将现有元素复制到新内存中。大量插入操作时会影响性能。
-
预留空间: 如果知道将要插入的元素数量,用 reserve() 方法来预先分配内存能减少重新分配次数。
vec.reserve(100); // 预留空间
-
隐式拷贝: 在向 std::vector 添加元素时,可能会发生拷贝。在处理大型对象时,应考虑使用移动语义(C++11 及更高版本)。
-
线程安全: std::vector 不保证线程安全。若多线程同时访问或修改同一个 std::vector,需要使用同步机制。