std::vector和vector
时间: 2024-09-07 07:03:22 浏览: 61
`std::vector`是C++标准库中的一个动态数组容器,它属于STL(Standard Template Library,标准模板库)的一部分。`std::vector`是一个动态大小的数组,可以在运行时自动调整容量,提供元素的增删操作,以及方便的随机访问功能。
与普通的数组相比,`std::vector`的主要优点包括:
1. **动态扩容**:当向容器添加元素超出当前容量时,会自动分配新的内存空间,并将原有数据复制过去,避免了频繁地手动扩容或缩容。
2. **范围迭代**:可以使用`begin()`和`end()`函数获取元素的起始和结束迭代器,支持简单的for循环遍历。
3. **容量管理**:`size()`用于获取元素个数,`reserve()`可以预分配内存空间,提高效率。
4. **安全机制**:如果试图访问越界的位置,不会导致程序崩溃,而是抛出异常。
创建`std::vector`的基本语法如下:
```cpp
std::vector<T> vec; // 创建空的vector
std::vector<T> vec(size); // 初始化指定长度的vector
std::vector<T> vec(array, size); // 使用数组初始化
```
相关问题
std::vector<std::vector<double >> *pp 和std::vector<std::vector<double >> pp区别
`std::vector<std::vector<double>>` 是一个二维向量,它内部存储的是 `std::vector<double>` 类型的对象。这意味着每个元素都是一个一维向量,用来存储 `double` 类型的数据。而 `std::vector<std::vector<double>> *pp` 则是一个指向这种二维向量的指针。
直接使用 `std::vector<std::vector<double>>` 表示的是一个可以直接操作的二维向量实例,你可以直接访问其元素并进行增删改查操作。然而,当使用指针 `*pp` 时,你实际上是在处理指向这个类型的内存地址,即你可以通过解引用 `(*pp)` 来访问这个二维向量,但不能直接对其进行修改,除非你先解引用再操作。
举个简单的例子来说明:
```cpp
// 直接创建和初始化二维向量
std::vector<std::vector<double>> v2d {{1.0, 2.0}, {3.0, 4.0}};
// 使用指针
std::vector<std::vector<double>> *pp = new std::vector<std::vector<double>> {{5.0, 6.0}, {7.0, 8.0}};
assert(*pp == v2d); // 比较指针所指向的内容
// 修改指针所指向的内容
(*pp) = 9.0;
```
这里要注意,指针 `pp` 的生命周期管理很重要,因为它涉及到动态内存分配。如果不正确地释放,可能会导致内存泄漏。所以在实际使用中,记得要适时删除指向的对象:
```cpp
delete pp;
```
std::vector<std::vector<std::vector<std::vector<double>>>> FiveDimArray如何初始化
`std::vector<std::vector<std::vector<std::vector<double>>>> FiveDimArray` 是一个高阶的动态数组,可以用于存储多维的数值数据。由于它的复杂层次结构,初始化时需要递归地创建每个维度的向量。下面是一个示例,展示了如何初始化一个四维的二维矩阵的二维矩阵(即五个维度,其中前四个维度都是2x2矩阵):
```cpp
#include <iostream>
using namespace std;
FiveDimArray initializeFiveDimArray(int outerDims[4], int innerSize) {
FiveDimArray five_dim_array;
for (int i = 0; i < outerDims[0]; ++i) {
vector<vector<vector<double>>> layer1;
for (int j = 0; j < outerDims[1]; ++j) {
vector<vector<double>> layer2;
for (int k = 0; k < outerDims[2]; ++k) {
vector<vector<double>> layer3;
for (int l = 0; l < outerDims[3]; ++l) {
layer3.push_back(vector<double>(innerSize, 0.0)); // 初始化为全零向量
}
layer2.push_back(layer3);
}
layer1.push_back(layer2);
}
five_dim_array.push_back(layer1); // 将当前层添加到五维数组中
}
return five_dim_array;
}
int main() {
const int dimensions[4] = {2, 2, 2, 2}; // 四个维度都设置为2x2
int innerSize = 5; // 内部元素数量
FiveDimArray five_dim_array = initializeFiveDimArray(dimensions, innerSize);
// 输出部分数据以验证初始化
for (const auto &layer : five_dim_array) {
for (const auto &row : layer) {
for (const auto &element : row) {
cout << element << ' ';
}
cout << endl;
}
cout << endl;
}
return 0;
}
```
在这个例子中,`initializeFiveDimArray` 函数接受外层维度的数组和内部元素的大小作为参数,然后逐层填充`FiveDimArray`。
阅读全文