文章目录
C++ vector容器
vector是可变数组。
容纳元素个数可以在运行期间变化。
std::vector 是 C++ 标准库中的动态数组容器,它提供了可变大小的数组功能,具有灵活性和多种强大的功能。
特点
-
动态大小: std::vector 可以根据需要动态增长或缩小,可以在运行时添加或删除元素,无需事先知道数组大小,容器内部会自动处理。
-
随时随机访问: std::vector 支持随机访问,可以使用下标运算符 [] 和
at()方法访问元素。 -
内存管理: std::vector 会自动管理内存,当元素超出当前大小时,会自动分配更多的内存,并根据需要移动现有元素。
-
元素安全性: 使用 at() 方法时,如果访问索引超出范围,会抛出 std::out_of_range 异常,提供了一定程度的安全性。
-
迭代器支持: std::vector 提供迭代器支持,可以使用标准算法进行遍历和操作。
-
内存连续性: std::vector 内部实现为连续的内存块,使得在访问元素时比链表等其他容器更快。
初始化
1. 利用初始化列表初始化
std::vector<int> vec = {1, 2, 3, 4, 5};
2. 指定大小并初始化
std::vector<int> vec(5, 0); // 初始化为 5 个元素,每个元素的值都为 0
3. 使用迭代器进行初始化
int arr[] = {1, 2, 3, 4, 5};
std::vector<int> vec(arr, arr + 5); // 利用数组的迭代器初始化 vector
4. 利用 push_back 添加元素
std::vector<int> vec;
vec.push_back(1);
vec.push_back(2);
vec.push_back(3);
5. 使用 resize 方法初始化
std::vector<int> vec;
vec.resize(5); // 初始化为 5 个元素,值为默认值
6. 利用 fill 进行初始化
std::vector<int> vec;
vec.assign(5, 0); // 初始化为 5 个元素,每个元素的值都为 0
7. 使用其它 vector 初始化
std::vector<int> anotherVec = {7, 8, 9};
std::vector<int> vec(anotherVec.begin(), anotherVec.end()); // 利用另一个 vector 迭代器初始化
这些是一些常用的 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,需要使用同步机制。
804

被折叠的 条评论
为什么被折叠?



