不定长数组:vector

使用需要包含头文件 #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

nelem的拷贝赋值给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位置插入nelem数据。无返回值。

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)

c1c2元素互换。

同上操作。

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个数据,数据均已缺省构造产生

创建一个含有nelem拷贝的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 );  



  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值