语法
C++ 标准库向量类是序列容器的类模板。 向量以线性排列方式存储给定类型的元素,并允许快速随机访问任何元素。 向量是需要力求保证访问性能时的首选序列容器。向量是一个能够存放任意类型的动态数组
名称 | 说明 |
---|---|
assign | 清除矢量并将指定的元素复制到该空矢量。 |
at | 返回对矢量中指定位置的元素的引用。 |
back | 返回对向量中最后一个元素的引用。 |
begin | 对该向量中第一个元素返回随机访问迭代器。 |
capacity | 返回在不分配更多的存储的情况下向量可以包含的元素数。 |
cbegin | 返回指向向量中第一个元素的随机访问常量迭代器。 |
cend | 返回一个随机访问常量迭代器,它指向刚超过矢量末尾的位置。 |
crbegin | 返回一个指向反向矢量中第一个元素的常量迭代器。 |
crend | 返回一个指向反向矢量末尾的常量迭代器。 |
clear | 清除向量的元素。 |
data | 返回指向向量中第一个元素的指针。 |
emplace | 将就地构造的元素插入到指定位置的向量中。 |
emplace_back | 将一个就地构造的元素添加到向量末尾。 |
empty | 测试矢量容器是否为空。 |
end | 返回指向矢量末尾的随机访问迭代器。 |
erase | 从指定位置删除向量中的一个元素或一系列元素。 erase会改变size,但是不改变capacity |
front | 返回对向量中第一个元素的引用。 |
get_allocator | 将对象返回到矢量使用的 allocator 类。 |
insert | 将一个元素或多个元素插入到指定位置的向量中。 |
max_size | 返回向量的最大长度。 |
pop_back | 删除矢量末尾处的元素。 |
push_back | 在矢量末尾处添加一个元素。 |
rbegin | 返回指向反向向量中第一个元素的迭代器。 |
rend | 返回一个指向反向矢量末尾的迭代器。 |
reserve | 保留向量对象的最小存储长度。 |
resize | 为矢量指定新的大小。 |
shrink_to_fit | 放弃额外容量。 |
size | 返回向量中的元素数量。 |
swap | 交换两个向量的元素。 |
示例
1.构造函数
- 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中
vector<int> a(10); //定义了10个整型元素的向量(尖括号中为元素类型名,它可以是任何合法的数据类型),但没有给出初值,其值是不确定的。
vector<int> a = new vector<int>(10); //错误的,new返还的是一个指针哦!
vector<int> *a = new vector<int>(10); //用指针类型变量去接收
vector<int> a(10,1); //定义了10个整型元素的向量,每个元素的初值为1。可以使用a[i]去遍历
vector<int> *a = new vector<int>(10,1); //用new的话可以使用iterator去遍历,用 * 析址符去读取每个值
for(auto iter = a->begin(); iter != a->end(); iter++)
cout << *iter <<endl;
vector<int> a(b); //用b向量来创建a向量,整体复制性赋值
vector<int> a(b.begin(),b.begin+3); //定义了a值为b中第0个到第2个(共3个)元素
int b[7]={1,2,3,4,5,9,8};
vector<int> a(b,b+7);
2.增加函数
void push_back(const T& x):向量尾部增加一个元素X
iterator insert(iterator it,const T& x):向量中迭代器指向元素前增加一个元素x
iterator insert(iterator it,int n,const T& x):向量中迭代器指向元素前增加n个相同的元素x
iterator insert(iterator it,const_iterator first,const_iterator last):向量中迭代器指向元素前插入另一个相同类型向量的[first,last)间的数据
a.push_back(5); //在a的最后一个向量后插入一个元素,其值为5
a.insert(a.begin()+1,5); //在a的第1个元素(从第0个算起)的位置插入数值5,如a为1,2,3,4,插入元素后为1,5,2,3,4
a.insert(a.begin()+1,3,5); //在a的第1个元素(从第0个算起)的位置插入3个数,其值都为5
a.insert(a.begin()+1,b.begin()+3,b.begin()+6); //b为数组,在a的第1个元素(从第0个算起)的位置插入b的第3个元素到第5个元素(不包括b+6),如b为1,2,3,4,5,9,8 ,插入元素后为1, 4,5,9, 2,3,4
3.删除函数
iterator erase(iterator it):删除向量中迭代器指向元素
iterator erase(iterator first,iterator last):删除向量中[first,last)中元素
void pop_back():删除向量中最后一个元素
void clear():清空向量中所有元素
a.clear(); //清空a中的元素
a.empty(); //判断a是否为空,空则返回ture,不空则返回false
a.pop_back(); //删除a向量的最后一个元素
a.erase(a.begin()+1,a.begin()+3); //删除a中第1个(从第0个算起)到第2个元素,也就是说删除的元素从a.begin()+1算起(包括它)一直到a.begin() + 3(不包括它)
std::remove() 貌似已经不建议使用了
std::remove() 删除容器中所有和指定元素值相等的元素,并返回指向最后一个元素下一个位置的迭代器。值得一提的是,调用该函数不会改变容器的大小和容量。
remove() 的实现原理是,在遍历容器中的元素时,一旦遇到目标元素,就做上标记,然后继续遍历,直到找到一个非目标元素,即用此元素将最先做标记的位置覆盖掉,同时将此非目标元素所在的位置也做上标记,等待找到新的非目标元素将其覆盖。因此,如果将下面程序中 demo 容器的元素全部输出,得到的结果为 1 4 5 4 3 5。
#include <iostream>
#include "vector"
#include <algorithm>
using namespace std;
int main(int argc, const char * argv[]) {
// insert code here...
vector<int>demo = { 1,3,3,4,3,5 };
//交换要删除元素和最后一个元素的位置
auto iter = std::remove(demo.begin(), demo.end(), 3);
cout<< "size: " << demo.size()<<endl;
cout<< "capacity: " << demo.capacity()<<endl;
for(auto v : demo){ //遍历整个demo
cout << v << " ";
}
cout<< endl;
//输出剩余的元素
for (auto first = demo.begin(); first < iter;++first) {
cout << *first << " ";
}
return 0;
}
size: 6
capacity: 6
1 4 5 4 3 5
1 4 5
配合erase删除掉无用的元素
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
vector<int>demo{ 1,3,3,4,3,5 };
//交换要删除元素和最后一个元素的位置
auto iter = std::remove(demo.begin(), demo.end(), 3);
demo.erase(iter, demo.end());
cout << "size is :" << demo.size() << endl;
cout << "capacity is :" << demo.capacity() << endl;
//输出剩余的元素
for (int i = 0; i < demo.size();i++) {
cout << demo[i] << " ";
}
return 0;
}
4.遍历函数
reference at(int pos):返回pos位置元素的引用
reference front():返回首元素的引用
reference back():返回尾元素的引用
iterator begin():返回向量头指针,指向第一个元素
iterator end():返回向量尾指针,指向向量最后一个元素的下一个位置
reverse_iterator rbegin():反向迭代器,指向最后一个元素
reverse_iterator rend():反向迭代器,指向第一个元素之前的位置
5.判断函数
bool empty() const:判断向量是否为空,若为空,则向量中无元素
6.大小函数
int size() const:返回向量中元素的个数
int capacity() const:返回当前向量所能容纳的最大元素值
int max_size() const:返回最大可允许的vector元素数量值
7.其他函数
void swap(vector&):交换两个同类型向量的数据
void assign(int n,const T& x):设置向量中前n个元素的值为x
void assign(const_iterator first,const_iterator last):向量中[first,last)中元素设置成当前向量元素
a.resize(10); //将a的现有元素个数调至10个,多则删,少则补,其值随机
a.resize(10,2); //将a的现有元素个数调至10个,多则删,少则补,其值为2
a.reserve(100); //将a的容量(capacity)扩充至100,也就是说现在测试a.capacity();的时候返回值是100.这种操作只有在需要给a添加大量数据的时候才显得有意义,因为这将避免内存多次容量扩充操作(当a的容量不足时电脑会自动扩容,当然这必然降低性能)
a.swap(b); //b为向量,将a中的元素和b中的元素进行整体性交换
a.assign(b.begin(), b.begin()+3); //b为向量,将b的0~2个元素构成的向量赋给a
a.assign(4,2); //是a只含4个元素,且每个元素为2
补充: for(auto i : v)遍历容器元素
- auto
auto 即 for(auto x: range) 这样会拷贝一份 range 元素,而不会改变 range 中元素;
- auto&
当需要修改range中元素,用 for(auto& x: range);
- const auto&
当只想读取 range 中元素时,使用 const auto&,如:for(const auto&x:range),它不会进行拷贝,也不会修改range;
- const auto
当需要拷贝元素,但不可修改拷贝出来的值时,使用 for(const auto x:range),避免拷贝开销。
/ vector_assign.cpp
// compile with: /EHsc
#include <vector>
#include <iostream>
int main()
{
using namespace std;
vector<int> v1, v2, v3;
v1.push_back(10);
v1.push_back(20);
v1.push_back(30);
v1.push_back(40);
v1.push_back(50);
cout << "v1 = ";
for (auto& v : v1){
cout << v << " ";
}
cout << endl;
v2.assign(v1.begin(), v1.end());
cout << "v2 = ";
for (auto& v : v2){
cout << v << " ";
}
cout << endl;
v3.assign(7, 4);
cout << "v3 = ";
for (auto& v : v3){
cout << v << " ";
}
cout << endl;
v3.assign({ 5, 6, 7 });
for (auto& v : v3){
cout << v << " ";
}
cout << endl;
}
v1 = 10 20 30 40 50
v2 = 10 20 30 40 50
v3 = 4 4 4 4 4 4 4
5 6 7