【C++】Vector
C++中的vector是一种动态数组,它可以根据需要动态地调整大小,同时还提供了许多实用的函数,使其非常适合用于存储和操作元素的集合。本文将介绍C++中的vector的基本概念、使用方法和常见应用场景。
一、基本概念
vector是C++ STL库中的一个容器,它可以存储任意类型的元素。vector使用连续的内存块存储元素,因此可以通过下标访问元素,具有类似数组的特性。与数组不同的是,vector可以动态地调整大小,因此可以根据需要添加或删除元素。
vector的声明格式如下:
arduinoCopy code
vector<数据类型> 变量名;
例如,声明一个存储int类型元素的vector:
arduinoCopy code
vector<int> v;
二、使用方法
- 添加元素
可以使用push_back函数向vector中添加元素:
scssCopy code
v.push_back(1); //添加一个整数1到vector中 v.push_back(2); //添加一个整数2到vector中
- 访问元素
可以使用下标访问vector中的元素:
cCopy code
cout << v[0] << endl; //输出vector中第一个元素的值
也可以使用at函数访问vector中的元素:
cCopy code
cout << v.at(1) << endl; //输出vector中第二个元素的值
需要注意的是,使用下标访问vector时,如果下标越界会导致程序崩溃,因此建议使用at函数访问元素。
- 删除元素可以使用pop_back函数删除vector中的最后一个元素:
v.pop_back(); //删除vector中最后一个元素
也可以使用erase函数删除指定位置的元素:
v.erase(v.begin()+1); //删除vector中第二个元素
需要注意的是,使用erase函数删除元素后,vector的大小会发生变化。
- 获取vector的大小;
可以使用size函数获取vector中元素的个数:
cout << v.size() << endl; //输出vector中元素的个数
- 遍历vector
可以使用for循环遍历vector中的元素:
for (int i = 0; i < v.size(); i++) { cout << v[i] << " "; //输出vector中的元素 } cout << endl;
也可以使用迭代器遍历vector中的元素:
for (vector<int>::iterator it = v.begin(); it != v.end(); it++) { cout << *it << " "; //输出vector中的元素 } cout << endl;
需要注意的是,使用迭代器遍历vector时,不要越界。
三、常见应用场景
- 保存和操作一组元素
vector可以用于保存一组元素,并且可以方便地添加、删除和访问元素。
- 保存动态大小的数据
-
由于vector可以动态调整大小,因此可以用于保存动态大小的数据,例如读入未知数量的数据时可以使用vector保存。
- 实现栈和队列
-
由于vector具有类似数组的特性,因此可以用于实现栈和队列等数据结构。
- 实现算法
-
vector可以用于实现各种算法,例如排序、查找、去重等,可以大大简化算法实现的过程。
四、总结
vector是C++中非常实用的容器,具有动态调整大小、方便访问元素、简化算法实现等优点,因此在编写C++程序时经常会用到。需要注意的是,使用vector时需要注意下标越界和迭代器越界的问题,以避免程序崩溃。
Vector 跟List 使用earse的区别
在 C++ 中,std::vector
和 std::list
是两种常见的容器类型,它们都提供了 erase
方法来删除容器中的元素,但二者在使用 erase
方法时有一些区别。
实现方式不同:
std::vector
是基于动态数组实现的容器,而std::list
是基于双向链表实现的容器。因此,它们在erase
操作的实现方式上有所不同。时间复杂度不同:
std::vector
的erase
方法的时间复杂度是 O(n),其中 n 是容器的大小,因为它需要将删除点后面的元素向前移动,以填补删除的空缺;而std::list
的erase
方法的时间复杂度是 O(1),因为它只需要修改相邻节点的指针即可。支持随机访问:
std::vector
支持随机访问,即可以通过下标访问容器中的元素;而std::list
不支持随机访问,因为它的元素并不是连续存储的。补充:vector、deque底层都是用了连续空间,所以虽然++iter迭代器了,但是erase(tempit)以后底层是连续空间,删除会挪动数据,最终导致iter意义变了,已失效了。
而list,不是连续空间,删除以后tempIt虽然失效了,但是不影响iter。
综上所述,如果需要删除一个元素后继续遍历容器,或者需要频繁进行插入和删除操作,建议使用 std::list
;如果需要支持随机访问、对容器进行排序等操作,建议使用 std::vector
。