使用需要包含头文件 #include <vector>
vector是一个模板类,所以需要用vector<int> a或者vector<double> b这种方式声明。
vector的常用操作:
int len = a.size();//返回vector长度
a.resize(100);//把a长度变为100
a.push_back(10)//把10添加到尾部
a.pop_back();//删除最后一个元素
a.clear();//清除a
bool is_kong = a.empty();//判断a是否空
Vector成员函数
函数 | 表述 |
c.assign(beg,end) c.assign(n,elem) | 将[beg; end)区间中的数据赋值给c。 将n个elem的拷贝赋值给c。 |
c.at(idx) | 传回索引idx所指的数据,如果idx越界,抛出out_of_range。 |
c.back() | 传回最后一个数据,不检查这个数据是否存在。 |
c.begin() | 传回迭代器中的第一个数据。 |
c.capacity() | 返回容器中数据个数。 |
c.clear() | 移除容器中所有数据。 |
c.empty() | 判断容器是否为空。 |
c.end() | 指向迭代器中的最后一个数据地址。 |
c.erase(pos) c.erase(beg,end) | 删除pos位置的数据,传回下一个数据的位置。 删除[beg,end)区间的数据,传回下一个数据的位置。 |
c.front() | 传回第一个数据。 |
get_allocator | 使用构造函数返回一个拷贝。 |
c.insert(pos,elem) c.insert(pos,n,elem) c.insert(pos,beg,end) | 在pos位置插入一个elem拷贝,传回新数据位置。 在pos位置插入n个elem数据。无返回值。 在pos位置插入在[beg,end)区间的数据。无返回值。 |
c.max_size() | 返回容器中最大数据的数量。 |
c.pop_back() | 删除最后一个数据。 |
c.push_back(elem) | 在尾部加入一个数据。 |
c.rbegin() | 传回一个逆向队列的第一个数据。 |
c.rend() | 传回一个逆向队列的最后一个数据的下一个位置。 |
c.resize(num) | 重新指定队列的长度。 |
c.reserve() | 保留适当的容量。 |
c.size() | 返回容器中实际数据的个数。 |
c1.swap(c2) swap(c1,c2) | 将c1和c2元素互换。 同上操作。 |
vector<Elem> c vector <Elem> c1(c2) vector <Elem> c(n) vector <Elem> c(n, elem) vector <Elem> c(beg,end) c.~ vector <Elem>() | 创建一个空的vector。 复制一个vector。 创建一个vector,含有n个数据,数据均已缺省构造产生。 创建一个含有n个elem拷贝的vector。 创建一个以[beg;end)区间的vector。 销毁所有数据,释放内存。 |
Vector操作
函数 | 描述 |
operator[] | 返回容器中指定位置的一个引用。 |
补充:
查找,find不属于vector的成员,而存在于算法中,应加上头文件#include <algorithm>:
int main( )
{
using namespace std;
vector<int> L;
L.push_back( 1 );
L.push_back( 2 );
L.push_back( 3 );
L.push_back( 4 );
L.push_back( 5 );
vector<int>::iterator result = find( L.begin( ), L.end( ), 3 ); //查找3
if ( result == L.end( ) ) //没找到
cout << "No" << endl;
else //找到
cout << "Yes" << endl;
}
按值删除
vector不像list有成员函数list.remove(value),只有erase()按位置进行删除操作,当不知道位置但想直接删除某个值时要用erase配合remove(<algorithm>里面的)来实现
1.
remove算法工作时并不是直接把元素删除,而是用后面的元素替代前面的元素,也即是说如果我对1234这个序列remove 2,返回的序列是 1344(3被复制到2的位置,4被复制到3的位置)。
这样上面的例子就好解释了,那两个3的元素并没有被移除,而是用后面的元素覆盖了前面的元素。多出的那两个数没有被移除掉而已。
那么我们应该如何真正完成移除呢?remove函数会返回一个迭代器,那个迭代器是这个序列的逻辑终点。所以可以再配合erase完成操作:
numbers.erase(remove(numbers.begin(), numbers.end(), 2), numbers.end());
2.
remove还有复制的过程对于某些特殊情况下可以不用,比如vector的要删除的某个值只有1个,这时候可以find()(<algorithm>里面的)配合erase来实现删除操作:
比如对1234这个序列删除2可以:(如果find没找到将返回.end())
numbers.erase(find(numbers.begin(),numbers.end(),2));
ps:用迭代器从开端循环找value然后再erase,用得不好会产生野指针,从而错误。
反转容器元素:
用reverse(vector.begin(),vector.end()),比如在最短路算法中求解最短路径可以这样用:
如果不是改变原来的容器,而是翻转之后放在新容器里面,直接用:
vector<int> get_path(int t){
vector<int> path;
for(;t!=-1;t=pre[t]) path.push_back(t);
//这样得到的是t到源点src的顺序所以反转之
reverse(path.begin(),path.end());
return path;
}
reverse_copy ( BidirectionalIterator first, BidirectionalIterator last, OutputIterator result );