C++容器之vector

时间:2024-07-20 07:03:43

C++ vector容器

vector是可变数组。
容纳元素个数可以在运行期间变化。

std::vector 是 C++ 标准库中的动态数组容器,它提供了可变大小的数组功能,具有灵活性和多种强大的功能。

特点

  1. 动态大小: std::vector 可以根据需要动态增长或缩小,可以在运行时添加或删除元素,无需事先知道数组大小,容器内部会自动处理。

  2. 随时随机访问: std::vector 支持随机访问,可以使用下标运算符 [] 和 at() 方法访问元素。

  3. 内存管理: std::vector 会自动管理内存,当元素超出当前大小时,会自动分配更多的内存,并根据需要移动现有元素。

  4. 元素安全性: 使用 at() 方法时,如果访问索引超出范围,会抛出 std::out_of_range 异常,提供了一定程度的安全性。

  5. 迭代器支持: std::vector 提供迭代器支持,可以使用标准算法进行遍历和操作。

  6. 内存连续性: 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;
}

在这里插入图片描述

注意事项

  1. 内存重新分配: 当 std::vector 的大小超过当前容量时,会分配一个新的更大的内存块,并将现有元素复制到新内存中。大量插入操作时会影响性能。

  2. 预留空间: 如果知道将要插入的元素数量,用 reserve() 方法来预先分配内存能减少重新分配次数。

    vec.reserve(100); // 预留空间
    
  3. 隐式拷贝: 在向 std::vector 添加元素时,可能会发生拷贝。在处理大型对象时,应考虑使用移动语义(C++11 及更高版本)。

  4. 线程安全: std::vector 不保证线程安全。若多线程同时访问或修改同一个 std::vector,需要使用同步机制。