文章目录
- Part.I Attention
- Chap.I 注意事项
- Chap.II 操作技巧
- Part.II Function
- Chap.I 构造函数
- Chap.II 增加函数
- Chap.III 删除函数
- Chap.IV 遍历函数
- Chap.V 判断/大小/其他函数
- Part.III Code
Part.I Attention
Chap.I 注意事项
使用vector
需要注意的地方:
- 加引用
#include <vector>
- 可直接作为『数组』调用,但是!如果要在函数中修改值,一定要加
&
!!!
Chap.II 操作技巧
一些技巧:
// 将 b 中的元素去重并从小到大排序
sort(b.begin(),b.end());
b.erase(unique(b.begin(),b.end()),b.end());
Part.II Function
函数一栏表:
函数名 | 含义 |
---|---|
begin() | 返回指向容器中第一个元素的迭代器。 |
end() | 返回指向容器最后一个元素所在位置后一个位置的迭代器,通常和 begin() 结合使用。 |
rbegin() | 返回指向最后一个元素的迭代器。 |
rend() | 返回指向第一个元素所在位置前一个位置的迭代器。 |
size() | 返回实际元素个数。 |
max_size() | 返回元素个数的最大值。这通常是一个很大的值,一般是 232-1,所以我们很少会用到这个函数。 |
resize() | 改变实际元素的个数。 |
capacity() | 返回当前容量。 |
empty() | 判断容器中是否有元素,若无元素,则返回 true;反之,返回 false。 |
reserve() | 增加容器的容量。 |
shrink _to_fit() | 将内存减少到等于当前元素实际所使用的大小。 |
operator[] | 重载了 [ ] 运算符,可以向访问数组中元素那样,通过下标即可访问甚至修改 vector 容器中的元素。 |
at() | 使用经过边界检查的索引访问元素。 |
front() | 返回第一个元素的引用。 |
back() | 返回最后一个元素的引用。 |
data() | 返回指向容器中第一个元素的指针。 |
assign() | 用新元素替换原有内容。 |
push_back() | 在序列的尾部添加一个元素。 |
pop_back() | 移出序列尾部的元素。 |
insert() | 在指定的位置插入一个或多个元素。 |
erase() | 移出一个元素或一段元素。 |
clear() | 移出所有的元素,容器大小变为 0。 |
swap() | 交换两个容器的所有元素。 |
emplace() | 在指定的位置直接生成一个元素。 |
emplace_back() | 在序列尾部生成一个元素。 |
Chap.I 构造函数
vector()
:创建一个空vector-
vector(int nSize)
:创建一个vector,元素个数为nSize vector(int nSize,const t& t)
:创建一个vector,元素个数为nSize,且值均为t-
vector(const vector&)
:复制构造函数 vector(begin,end)
:复制[begin,end)
区间内另一个数组的元素到vector中
下面是调用构造函数的示例:
// 定义了10个整型元素的向量,初始化为 1
vector<int> a(10,1);
// 定义一个二维 vector 向量,所有元素初始化为 1
vector<int> a(10,1);
vector<vector<int>> aa(10,a);
// 通过 int[] 构造并初始化 vector
int b[7] = {1,2,3,4,5,9,8};
vector<int> a(b,b+7);
// 直接用数组构造
vector<int> a({1,2,3,4,5,9,8});
Chap.II 增加函数
void push_back(const T& x)
:向量尾部增加一个元素Xiterator insert(iterator it,const T& x)
:向量中迭代器指向元素前增加一个元素xiterator insert(iterator it,int n,const T& x)
:向量中迭代器指向元素前增加n个相同的元素xiterator insert(iterator it,const_iterator first,const_iterator last)
:向量中迭代器指向元素前插入另一个相同类型向量的[first,last)
间的数据
下面是一个简单操作实例:
vector<int> a(10,1); // 10个1
auto itr=a.begin()+3; // 得到第 3 个迭代器
a.insert(itr,2,8); // 在迭代器的位置处插入 2 个 8,a=[1 1 1 8 8 1 1 1 1 1 1 1]
Chap.III 删除函数
iterator erase(iterator it)
:删除向量中迭代器指向元素iterator erase(iterator first,iterator last)
:删除向量中[first,last)
中的元素void pop_back()
:删除向量中最后一个元素void clear()
:清空向量中所有元素
下面是一个简单操作实例:
auto tmp=a.erase(a.begin()+2,a.begin()+4);
a.pop_back(); // 删除最后一个元素
第一句的含义:删除了vector
第 3 个元素到第 5 个元素(不含)共两个元素,返回删除之后的第 3 个元素的迭代器。
Chap.IV 遍历函数
T at(int pos)
:返回pos位置元素的引用T front()
:返回首元素的引用T back()
:返回尾元素的引用iterator begin()
:返回向量头指针,指向第一个元素iterator end()
:返回向量尾指针,指向向量最后一个元素的下一个位置reverse_iterator rbegin()
:反向迭代器,指向最后一个元素reverse_iterator rend()
:反向迭代器,指向第一个元素之前的位置
注意:
- vector 可以用
[]
来获取一个某个索引的元素值,但是不能像python
那样有切片操作。 end()
返回的是最后一个元素之后的迭代器,*(vec.end()-1)
才是最后一个元素的值
vector<int> b({1,2,3,4,5,6,7,8});
cout<<b.front()<<" "<<b.back()<<endl; // 1 8
cout<<*b.begin()<<" "<<*(b.end()-1)<<endl; // 1 8
Chap.V 判断/大小/其他函数
bool empty() const
:判断向量是否为空,若为空,则向量中无元素int size() const
:返回向量中元素的个数int capacity() const
:返回当前向量所能容纳的最大元素值int max_size() const
:返回最大可允许的 vector 元素数量值void swap(vector&)
:交换两个同类型向量的数据void assign(int n,const T& x)
:设置向量中前n个元素的值为xvoid assign(const_iterator first,const_iterator last)
:向量中[first,last)
中元素设置成当前向量元素
cout<<b.empty()<<endl;
cout<<b.size()<<" "<<b.capacity()<<" "<<b.max_size()<<endl;
printVec(b);
b.assign(6,10); // 指定 b 中的元素为6个10
printVec(b);
b.assign(b.begin()+1,b.end()-1); // 去掉 b 第一个元素和最后一个元素
printVec(b);
Part.III Code
下面是学习 Vector
过程中用到的代码(其实就是上面的代码的汇总):
#include <iostream>
#include <iomanip>
#include <vector>
using namespace std;
int main()
{
auto printVec=[](vector<int> vec) {for(auto& c:vec) cout << c << " ";cout << endl;};
// 构造
vector<int> a(10,1);
printVec(a);
// 插入
auto itr=a.begin()+3;
auto tmp = a.insert(itr,2,8);
cout << *(tmp+1)<<endl;
printVec(a);
// 删除
tmp=a.erase(a.begin()+2,a.begin()+4);// 删除的元素不包含 itr+1
cout <<* tmp<<endl;
printVec(a);
a.pop_back();
printVec(a);
// 修改
a[3]=3;
a.push_back(4);
printVec(a);
// 遍历
vector<int> b({1,2,3,4,5,6,7,8});
cout<<b.front()<<" "<<b.back()<<endl;
cout<<*b.begin()<<" "<<*(b.end()-1)<<endl;
// 其他函数
cout<<b.empty()<<endl;
cout<<b.size()<<" "<<b.capacity()<<" "<<b.max_size()<<endl;
printVec(b);
b.assign(6,10); // 指定 b 中的元素为6个10
printVec(b);
b.assign(b.begin()+1,b.end()-1); // 去掉 b 第一个元素和最后一个元素
printVec(b);
getchar();
return 0;
}
输出如下:
1 1 1 1 1 1 1 1 1 1
8
1 1 1 8 8 1 1 1 1 1 1 1
8
1 1 8 1 1 1 1 1 1 1
1 1 8 1 1 1 1 1 1
1 1 8 3 1 1 1 1 1 4
1 8
1 8
0
8 8 2305843009213693951
1 2 3 4 5 6 7 8
10 10 10 10 10 10
10 10 10 10