c++3.vector容器
大约 5 分钟
vector
静态空间 vs. 动态扩展:
- 数组:在定义时,数组的大小就已经固定,它占据静态的空间,无法在运行时改变大小。数组的大小是在编译时确定的。
std::vector
:std::vector
是一个动态数组的实现,它可以在运行时动态扩展。这意味着std::vector
的大小可以根据需要动态增加或减少,而不需要手动管理内存。
动态扩展的实现:
- 当
std::vector
的容量不足以容纳新元素时,它会请求更大的内存块。这通常涉及到分配一块新的内存空间,将原有元素拷贝到新的内存中,然后释放原有的内存。这个过程确保了内存的连续性,有助于提高访问效率。 - 遵循左闭右开原则
- 当
- 优势和灵活性:
std::vector
提供了动态内存管理,这使得它在处理不确定数量的元素时更为灵活。它自动处理内存的分配和释放,减轻了程序员的负担。- 普通数组在编译时就需要知道其大小,这可能导致一些不便,尤其是在需要动态调整大小的情况下。
实例化vector
实例化
std::vector<int> v;
标准库中的定义
template < class T, class Alloc = allocator<T> > class vector;
基本方法
这是vector成员函数参考
#include <iostream>
#include <vector>
int main() {
std::vector<int> v;
// 添加元素
v.push_back(10); // 将 10 添加到 v 中
v.push_back(20);
// 打印元素
std::cout << "打印元素: ";
for (const auto& element : v) {
std::cout << element << " ";
}
std::cout << "\n";
// 修改元素
v[1] = 25; // 将索引为 1 的元素修改为 25
// 删除元素
v.pop_back(); // 删除最后一个元素
// 插入元素
v.insert(v.begin() + 1, 15); // 在索引为 1 的位置插入元素 15
// 输出修改后的向量元素
std::cout << "修改后: ";
for (const auto& element : v) {
std::cout << element << " ";
}
std::cout << "\n";
// 查找元素
int target = 15;
auto it = std::find(v.begin(), v.end(), target);
if (it != v.end()) {
std::cout << "元素 " << target << "找到的索引 " << std::distance(v.begin(), it) << "\n";
} else {
std::cout << "元素 " << target << " 没有找到元素\n";
}
return 0;
}
迭代器
#include <iostream>
#include <vector>
int main() {
// 创建一个包含整数的 vector
std::vector<int> myVector = {1, 2, 3, 4, 5};
// ①使用迭代器遍历 vector 并输出元素
for (std::vector<int>::iterator it = myVector.begin(); it != myVector.end(); ++it)
{
*it *= 2; //也可以修改
std::cout << *it << " ";
}
std::cout << "\n";
// ②使用范围-based for 循环(C++11及以后版本)
for (const auto& element : myVector)
{
std::cout << element << " ";
}
std::cout << "\n";
return 0;
}
问题
1. 为什么要用迭代器遍历
2.动态开辟空间问题优化-预留空间
#include <iostream>
#include <vector>
int main() {
int num = 0 ;
int *p = nullptr;
std::vector<int> v;
for(int i = 0; i < 100000; ++i){
v.push_back(i);
if(p!=&v[0]){
p = &v[0];
num++;
std::cout<<"num="<<num<<std::endl;
}
}
}
3. front和begin区别
begin()
函数:- 返回类型:
begin()
函数返回一个迭代器,指向双端队列的第一个元素(前端块的第一个元素)。 - 用途: 主要用于遍历
std::vector
中的元素,它标识了双端队列的起始位置。
std::vector<int> myVector = {1, 2, 3, 4, 5}; std::vector<int>::iterator it = myVector.begin();
- 返回类型:
front()
函数:- 返回类型:
front()
函数返回一个引用,指向双端队列的第一个元素(前端块的第一个元素)。 - 用途: 主要用于访问或修改
std::vector
的第一个元素的值。
std::vector<int> myVector = {1, 2, 3, 4, 5}; int firstElement = myVector.front();
- 返回类型:
总结:
begin()
返回一个迭代器,主要用于遍历容器元素。front()
返回第一个元素的引用,主要用于访问或修改第一个元素的值。