文章目录
引用头文件
#include <vector>
初始化赋值
1. 一维 vector
- 使用构造函数初始化
//全部初始化为零
vector<int> vec(10, 0);
//全部初始化未指定赋值
vector<int> vec(10);
- 拷贝复制
vector<int> list2(list1);
or
vector<int> list2 = list1;
- 直接初始化赋值
vector<int> vec = {1, 2, 3};
- 使用数组初始化赋值
int arr[] = {11, 32, 41, 25, 67, 100, 88, 233}; // 列表初始化内置数组
// 指出拷贝区域范围,使用数组初始化 vector 对象
vector<int> iv(begin(arr), end(arr)); // 遍历 iv 数据:11 32 41 25 67 100 88 233
vector<int> jv(arr + 2, arr + 7); // 遍历 iv 数据:41 25 67 100 88
2. 二维 vector
- 使用构造函数初始化
//10行6列,全部初始化为零
vector<vector<int>> vec(10, vector<int>(6, 0));
- 拷贝复制
vector<vector<int>> vec(vec1);
- 直接初始化赋值
vector<vector<int>> vec = {
{1, 2, 3},
{4, 5, 6},
};
- 使用数组初始化赋值
// 初始化一个 二维vector 行row,第二个参数为一维vector;
vector<vector<int> > vecto(row,vector<int>(vt[0].begin()+1,vt[0].begin()+3));
遍历 vector 容器
1. 下标索引遍历
void PrintfVector(vector<int> v)
{
for(unsigned int i = 0; i < v.size(); ++i) {
cout<<v[i]<<" ";
}
cout<<endl;
}
2. 迭代器遍历
void PrintfVector(vector<int> v)
{
// 注:如果参数为const vector<int> 需要用const_iterator
// vector<int>::const_iterator iter=v.begin();
for(vector<int>::iterator it = v.begin(); it != v.end(); ++it)
{
cout<<(*it)<<" ";
}
cout<<endl;
}
3. auto
void PrintfVector(vector<int> v)
{
// 注:如果参数为const vector<int> 需要用const_iterator
// vector<int>::const_iterator iter=v.begin();
for(auto it = v.begin(); it != v.end(); ++it)
{
cout<<(*it)<<" ";
}
cout<<endl;
}
4. range for循环
void PrintfVector(vector<int> v)
{
// 注:如果参数为const vector<int> 需要用const_iterator
// vector<int>::const_iterator iter=v.begin();
for(auto val : v)
{
cout<<( val )<<" ";
}
cout<<endl;
}
5. for_each
for_each(iterator beg, iterator end, _callback);
vector<int> v = {3,5,1,7,10}; // vector容器
auto print = [](const auto& x) // 定义一个lambda表达式
{
cout << x << ",";
};
for_each(cbegin(v), cend(v), print);// for_each算法
for_each( // for_each算法,内部定义lambda表达式
cbegin(v), cend(v), // 获取常量迭代器
[](const auto& x) // 匿名lambda表达式
{
cout << x << ",";
}
);
迭代器
vector
迭代器支持 ++ -- +i -i
操作
vector 常用方法
方法 | 说明 |
---|---|
at(n) | 返回对向量中位置 n 处的元素 |
back() | 返回对向量最后一个元素 |
front() | 返回对向量第一个元素 |
begin() | 返回指向向量第一个元素的随机访问迭代器 |
end() | 返回一个迭代器,它指向向量容器中的 past-the-end 元素 |
cbegin() | 返回指向向量开头的常量随机访问迭代器 |
cend() | 返回指向 past-the-end 的常量随机访问迭代器 |
rbegin() | 返回一个反向迭代器,它指向向量的最后一个元素 |
rend() | 返回一个反向迭代器,它指向向量的反向端 |
empty() | 测试向量是否为空 |
erase(v.begin()) | 从向量中删除单个元素 |
insert(v.begin(), value) | 从向量中插入单个元素 |
pop_back( ) | 从向量中删除最后一个元素并将向量的大小减小一 |
push_back( ) | 在向量末尾插入新元素并将向量的大小增加一 |
size( ) | 返回向量中存在的元素数 |
判断 vector 是否空
v.empty()
如果 v 为空,则返回 true, 否则返回 false
返回数组长度
v.size(a)
返回数组 v 的长度
尾部插入元素
v.push_back(a)
将元素a插入到数组v的尾部
删除尾部元素
v.pop_back()
删除最后一个数据
调整数组大小
v.resize(n,m)
重新调整数组大小为n,如果n比原来的小则删除多余信息;如果n比原来大则新增部分初始化为m,其中m可以省略
获取迭代器
方法 | 说明 |
---|---|
v.begin() | 返回数组v首元素(也就是v[0])的迭代器 |
v.end() | 返回数组v末尾元素下一个元素的迭代器,为空指针,不指向任何元素 |
v.cbegin() 和 v.cend() | C++11新增,它们返回一个const的迭代器,不能用于修改元素 |
插入元素
插入位置需为:迭代器类型
方法 | 说明 |
---|---|
v.insert(pos,elem) | 在pos位置插入一个elem拷贝,传回新数据位置。 |
v.insert(pos,n,elem) | 在pos位置插入n个elem数据。无返回值。 |
v.insert(pos,beg,end) | 在pos位置插入在[beg,end)区间的数据。无返回值。 |
v.insert(v.begin(), 2);
v.insert(v.begin(), 4, 5);
vector<int> v1 = {2, 3, 4, 5};
vector<int> v2 = {1};
v2.insert(v2.begin() + 1, v1.begin(), v1.begin() + 3);
删除元素
方法 | 说明 |
---|---|
v.erase(pos) | 删除pos位置的数据,传回下一个数据的位置 |
v.erase(beg,end) | 删除[beg,end)区间的数据,传回下一个数据的位置 |
v.erase(v.begin(), v.begin() + 2);
排序 sort
#include<algorithm>
sort(vec.begin(),vec.end()); // (默认是按升序排列,即从小到大)
bool Comp(const int &a,const int &b)
{
return a>b;
}
sort(vec.begin(),vec.end(),Comp) // 这样就降序排序。
翻转 reverse
#include<algorithm>
// 将元素翻转(在vector中,如果一个函数中需要两个迭代器,一般后一个都不包含.)
reverse(vec.begin(),vec.end());
判断 vector 中包含某一元素
#include<algorithm>
// 如果count返回0,则表示不存在该元素。 在 v 中 查找 key
if(count(v.begin(), v.end(), key))
if(find(v.begin(), v.end(), key) != v.end())