std::vector使用
时间: 2024-08-16 10:04:36 浏览: 46
`std::vector`是C++标准库中的一个动态数组容器,它提供了一种灵活的方式来存储和管理元素。它的主要特性包括:
1. 动态大小:`std::vector`能够自动调整大小以适应添加或删除元素的需求。当你向其末尾添加元素时,它会自动扩容;当容量超过实际元素数量过多时,它又会缩小空间。
2. 随机访问:由于它是连续的内存块,所以可以直接通过索引快速获取和修改元素,支持高效的随机访问操作。
3. 内部排序:`std::vector`实现了对内部元素的快速排序功能,你可以选择是否开启。
4. 插入和删除效率:在元素的开头、结尾以及中间位置插入和删除元素的时间复杂度通常都是O(1),但在元素之间插入或删除则需要移动其他元素,时间复杂度为O(n)。
5. 链表底层实现:虽然名为“vector”,但在某些情况下,尤其是频繁的插入和删除操作中间元素时,可能会像链表一样工作,效率较低。
使用`std::vector`时,你需要包含头文件`#include <vector>`,然后可以创建一个实例并指定初始容量,如`std::vector<int> myVector(10)`。常见的操作有push_back(在末尾添加元素)、pop_back(移除末尾元素)、at(通过索引获取元素)等。
相关问题
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::pair<std::string, std::vector<string>>>,请问如何分别取到std::pair中的std::string和std::vector<string>呢
要分别取到`std::pair`中的`std::string`和`std::vector<string>`,可以使用`std::get`函数。示例代码如下:
```cpp
#include <iostream>
#include <vector>
#include <string>
int main() {
std::vector<std::pair<std::string, std::vector<std::string>>> vec;
// 添加一些数据到vec中
vec.push_back(std::make_pair("pair1", std::vector<std::string>{"string1", "string2", "string3"}));
vec.push_back(std::make_pair("pair2", std::vector<std::string>{"string4", "string5"}));
vec.push_back(std::make_pair("pair3", std::vector<std::string>{"string6"}));
// 遍历vec,取出每个pair中的string和vector<string>
for (const auto& pair : vec) {
std::cout << "First string: " << std::get<0>(pair) << std::endl;
std::cout << "Second vector of string: ";
const auto& vectorOfString = std::get<1>(pair);
for (const auto& str : vectorOfString) {
std::cout << str << " ";
}
std::cout << std::endl;
}
return 0;
}
```
输出结果:
```
First string: pair1
Second vector of string: string1 string2 string3
First string: pair2
Second vector of string: string4 string5
First string: pair3
Second vector of string: string6
```
阅读全文