1、写在前面
大家好,今天文章的内容是:
- vector容器
2、内容
2.1、介绍
vector
(向量)是一个序列容器,表示可以改变大小的数组。
vector
容器对元素使用连续的存储位置,使用变量名加索引值来访问其元素,这看起来和数组差不多。
那vector
容器和数组的区别在哪?
区别在于,vector
容器的大小是动态变化的,其存储是由vector
容器自动处理。与数组相比,vector
容器会消耗更多的内存,用于换取以高效方式管理存储和动态增长的能力。
简单的说,vector
容器来内部使用用动态分配的数组来存储其元素。如果容器插入新元素后容量不够,则需要重新分配此数组,以增加其大小(也就是分配一个新数组并将所有的元素移动过去),为了提高效率,vector
容器会分配额外的存储空间,实际容量可能大于数组大小,以适应可能的存储空间变化。
2.2、使用
导入头文件
vector
容器以类模板vector<T>
的形式定义在<vector>
头文件中,并位于std
命名空间中。
因此我们在创建vector
容器之前需要导入以下代码:
#include <vector>
using namespace std;
在导入头文件后,就可以使用vector
容器了。
创建容器
创建vector
容器一般有五种方法:
#include<iostream>
#include<vector>
using namespace std;
int main() {
vector<int> first; // 创建一个空的vector容器
vector<int> second(10); // 有10个元素,默认初始值为0
vector<int> third(10,5); // 有10个元素,指定初始值为5
vector<int> fourth{1, 3, 5, 7}; // 创建并指定初始值
vector<int> fifth(fourth); // 通过其他存储类型相同的容器存来创建新的vector容器
return 0;
}
上述vector容器创建后,元素内容如下:
first: []
second: [0,0,0,0,0,0,0,0,0,0]
third: [5,5,5,5,5,5,5,5,5,5]
fourth: [1,3,5,7]
fifth: [1,3,5,7]
成员函数
vector
容器的成员函数有很多,现简单记录如下:
push_back()
void push_back (const value_type& val); // C++98 / C++11
void push_back (value_type&& val); // C++11
该函数用于在当前vector
容器末尾元素的后面添加一个新的元素,此时vector
容器的大小将加一。注意,这有可能导致自动重新分配存储空间。
举个例子:
#include<iostream>
#include<vector>
using namespace std;
int main() {
vector<int> val; // []
val.push_back(8); // [8]
val.push_back(16); // [8,16]
val.push_back(4); // [8,16,4]
val.push_back(73); // [8,16,4,73]
return 0;
}
clear()
void clear(); // C++98
void clear() noexcept; // C++11
该函数用于销毁vector
容器中的所有元素,这时容器的大小变为0。
empty()
bool empty() const; // C++98
bool empty() const noexcept; // C++11
empty()
函数用于判断容器是否为空,是就返回true
,否则返回false
。
pop_back()
void pop_back();
该函数用于弹出(删除)中当前vector
容器的最后一个元素,此时容器大小将减一。
举个例子:
#include <iostream>
#include <vector>
using namespace std;
// 备注:
// back()函数,用于返回容器最后一个元素的引用
int main( ) {
vector<int> ans; // []
ans.push_back(10); // [10]
ans.push_back(20); // [10,20]
ans.push_back(30); // [10,20,30]
int sum = 0;
// 当容器为空时退出循环
while (!ans.empty()) {
sum += ans.back(); // 添加当前容器的最后一个元素到sum中
ans.pop_back(); // 弹出末尾元素
}
cout << "ans中的元素之和为:" << sum << '\n';
return 0;
}
运行结果:
ans中的元素之和为:60
size()
size_type size() const; // C++98
size_type size() const noexcept; // C++11
该函数用于返回容器中的元素个数。
注意,这里指的元素个数不等同于vector
容器的容量。
举个例子:
#include <iostream>
#include <vector>
using namespace std;
int main( ) {
vector<int> value {1,3,5,7}; // [1,3,5,7]
value.push_back(9); // [1,3,5,7,9]
int size = value.size(); // size为容器元素个数
cout << "value中的元素为:";
for(int i = 0; i<size; i++) {
cout << value[i] << " ";
}
return 0;
}
运行结果:
value中的元素为:1 3 5 7 9
insert()
- C++98
// 方式一:插入单个元素
iterator insert (iterator position, const value_type& val);
// 方式二:填充容器
void insert (iterator position, size_type n, const value_type& val);
// 方式三:插入指定范围内的元素
template <class InputIterator> void insert (iterator position, InputIterator first, InputIterator last);
- C++11
// 方式一:插入单个元素
iterator insert (const_iterator position, const value_type& val);
// 方式二:填充容器
iterator insert (const_iterator position, size_type n, const value_type& val);
// 方式三:插入指定范围内的元素
template <class InputIterator>iterator insert (const_iterator position, InputIterator first, InputIterator last);
// 方式四:右值引用
iterator insert (const_iterator position, value_type&& val);
// 方式五:利用初始化列表插入
iterator insert (const_iterator position, initializer_list<value_type> il);
该函数用于在指定的位置插入一个或多个元素。
- 例一:
#include <iostream>
#include <vector>
using namespace std;
int main () {
vector<int> myVector (3,111);
cout << "插入前,容器中的元素为;";
for (int i = 0; i < myVector.size(); i++) {
cout << ' ' << myVector[i];
}
cout << endl;
// 指向vector中第一个元素的迭代器对象;
vector<int>::iterator it = myVector.begin();
// 插入元素
it = myVector.insert(it, 200);
cout << "插入后,容器中的元素为;";
for (int i = 0; i < myVector.size(); i++) {
cout << ' ' << myVector[i];
}
cout << endl;
return 0;
}
运行结果:
插入前,容器中的元素为; 111 111 111
插入后,容器中的元素为; 200 111 111 111
- 例二:
#include <iostream>
#include <vector>
using namespace std;
int main () {
vector<int> myVector (3,111);
cout << "插入前,容器中的元素为;";
for (int i = 0; i < myVector.size(); i++) {
cout << ' ' << myVector[i];
}
cout << endl;
// 指向vector中第一个元素的迭代器;
vector<int>::iterator it = myVector.begin();
// 插入元素
myVector.insert(it, 3, 333);
cout << "插入后,容器中的元素为;";
for (int i = 0; i < myVector.size(); i++) {
cout << ' ' << myVector[i];
}
cout << endl;
return 0;
}
运行结果:
插入前,容器中的元素为; 111 111 111
插入后,容器中的元素为; 333 333 333 111 111 111
- 例三:
#include <iostream>
#include <vector>
using namespace std;
int main () {
vector<int> myVector (3,111);
cout << "插入前,容器中的元素为;";
for (int i = 0; i < myVector.size(); i++) {
cout << ' ' << myVector[i];
}
cout << endl;
// 指向vector中第一个元素的迭代器;
vector<int>::iterator it = myVector.begin();
// 新容器:[444, 444]
vector<int> newVector (2,444);
// 将新容器中指定的元素插入旧容器中
myVector.insert(it+1, newVector.begin(), newVector.end());
cout << "插入后,容器中的元素为;";
for (int i = 0; i < myVector.size(); i++) {
cout << ' ' << myVector[i];
}
cout << endl;
return 0;
}
运行结果:
插入前,容器中的元素为; 111 111 111
插入后,容器中的元素为; 111 444 444 111 111
- 例四:
#include <iostream>
#include <vector>
using namespace std;
int main () {
vector<int> myVector (3,111);
cout << "插入前,容器中的元素为;";
for (int i = 0; i < myVector.size(); i++) {
cout << ' ' << myVector[i];
}
cout << endl;
// 定义一个数组
int myArray [] = {555, 555, 555};
// 将数组中指定的元素插入旧容器中
myVector.insert (myVector.begin(), myArray, myArray+3);
cout << "插入后,容器中的元素为;";
for (int i = 0; i < myVector.size(); i++) {
cout << ' ' << myVector[i];
}
cout << endl;
return 0;
}
运行结果:
插入前,容器中的元素为; 111 111 111
插入后,容器中的元素为; 555 555 555 111 111 111
erase()
- C++98:
iterator erase (iterator position);
iterator erase (iterator first, iterator last);
- C++11:
iterator erase (const_iterator position);
iterator erase (const_iterator first, const_iterator last);
该函数用于删除容器中的单个元素或者一组元素。
备注,在指定删除范围时,区间是左闭右开:$[first,last)$
- 例一:
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> myVector;
for(int i = 1; i<=10; i++) {
myVector.push_back(i);
}
// 遍历并输出元素
cout << "删除前,容器中的元素为:";
for(int i = 0; i<myVector.size(); i++) {
cout << " " << myVector[i];
}
cout << '\n';
// 删除单个元素:myVector.begin()指向了第一个元素,加5后就是指向第六个元素
myVector.erase (myVector.begin()+5);
// 遍历并输出元素
cout << "删除后,容器中的元素为:";
for(int i = 0; i<myVector.size(); i++) {
cout << " " << myVector[i];
}
cout << '\n';
return 0;
}
运行结果:
删除前,容器中的元素为: 1 2 3 4 5 6 7 8 9 10
删除后,容器中的元素为: 1 2 3 4 5 7 8 9 10
- 例二:
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> myVector;
for(int i = 1; i<=10; i++) {
myVector.push_back(i);
}
// 遍历并输出元素
cout << "删除前,容器中的元素为:";
for(int i = 0; i<myVector.size(); i++) {
cout << " " << myVector[i];
}
cout << '\n';
// 删除指定区间 [0, 4) 中的元素,效果等同于删除前三个元素
myVector.erase (myVector.begin(), myVector.begin()+3);
// 遍历并输出元素
cout << "删除后,容器中的元素为:";
for(int i = 0; i<myVector.size(); i++) {
cout << " " << myVector[i];
}
cout << '\n';
return 0;
}
运行结果:
删除前,容器中的元素为: 1 2 3 4 5 6 7 8 9 10
删除后,容器中的元素为: 4 5 6 7 8 9 10
遍历容器
现在有一个vector
容器val
,内容为:[1,3,5,7,9]
代码如下:
#include<iostream>
#include<vector>
using namespace std;
int main() {
// 创建空容器
vector<int> val;
// 插入数据
val.push_back(1);
val.push_back(3);
val.push_back(5);
val.push_back(7);
val.push_back(9);
return 0;
}
现在给出三个遍历容器的例子。
- 备注,遍历结果为:
1 3 5 7 9
举例一
for(int i = 0; i<val.size(); i++) {
cout << val[i] << " ";
}
举例二
for(vector<int>::iterator it = val.begin(); it != val.end(); ++it) {
cout << *it << " ";
}
举例三
for(auto i = val.begin(); i < val.end(); i++) {
cout << *i << " ";
}
3、写在最后
好的,今天就先记录到这里。