📜  向量STL中的常见细微差别(1)

📅  最后修改于: 2023-12-03 15:07:29.632000             🧑  作者: Mango

向量STL中的常见细微差别

向量(vector)是C++中最常用的容器之一,但在不同的STL实现中可能存在一些微小的差别。本文将介绍一些常见的细微差别,帮助程序员更好地使用向量STL。

复制构造函数和移动构造函数

在某些向量STL实现中,复制构造函数和移动构造函数的行为会有所不同。具体来说,复制构造函数可能会深拷贝(deep copy)或浅拷贝(shallow copy)向量,而移动构造函数则只进行浅拷贝。

深拷贝会在内存中创建一个新的向量,并将原向量的元素复制到新向量中。浅拷贝只是在新向量中创建一个对原向量的引用。

// 深拷贝
std::vector<int> v1{1, 2, 3};
std::vector<int> v2(v1); // v2是一个新的向量,包含v1的元素

// 浅拷贝
std::vector<int> v3{4, 5, 6};
std::vector<int>& v4 = v3; // v4是v3的引用,与v3共享同一组元素

因此,在使用复制构造函数和移动构造函数时,需要注意它们的行为差异,确保选择正确的方法。

访问元素

向量STL提供了多种访问元素的方法,包括[]运算符、at()函数和迭代器。但是,在某些STL实现中,[]运算符可能会执行越界检查,而at()函数则不会执行越界检查,因此在访问元素时需要注意。

std::vector<int> v{1, 2, 3};

// []运算符
int x = v[0]; // 不会抛出异常
int y = v[10]; // 可能抛出异常,在某些STL实现中执行越界检查

// at()函数
int z = v.at(0); // 不会抛出异常
int w = v.at(10); // 一定会抛出异常

可以看到,使用at()函数可以更可靠地访问元素,因为它始终会执行越界检查。

清空向量

在向量STL中,可以使用clear()函数清空所有元素。然而,在某些STL实现中,clear()函数并不会释放所有内存,而是将内存保留在向量中以便下一次使用。因此,在清空向量时,可能需要使用shrink_to_fit()函数,以确保释放所有内存。

std::vector<int> v{1, 2, 3};

v.clear();
// 这时,向量v中的元素已经被清空,但其仍占用一定量的内存

v.shrink_to_fit();
// 这时,向量v中的元素已经被清空,其占用的内存也被释放
总结

本文介绍了向量STL中一些常见的细微差别,包括复制构造函数和移动构造函数的行为、访问元素的方法以及清空向量的方式。了解这些细节可以帮助程序员更好地使用向量STL,在确保代码正确性和效率的同时,也能更好地利用向量STL提供的便捷。