vector:

来源:互联网 发布:阿里云备案承诺书模板 编辑:程序博客网 时间:2024/04/30 07:48
STL:标准模板库,是很多聪明人的杰作总结所成,会用即可
vector:
Constructors 构造函数
Operators 对vector进行赋值或比较
assign() 对Vector中的元素赋值
at() 返回指定位置的元素
back() 返回最末一个元素
begin() 返回第一个元素的迭代器
capacity() 返回vector所能容纳的元素数量(在不重新分配内存的情况下)
clear() 清空所有元素
empty() 判断Vector是否为空(返回true时为空)
end() 返回最末元素的迭代器(译注:实指向最末元素的下一个位置)
erase() 删除指定元素
front() 返回第一个元素
get_allocator() 返回vector的内存分配器
insert() 插入元素到Vector中
max_size() 返回Vector所能容纳元素的最大数量(上限)
pop_back() 移除最后一个元素
push_back() 在Vector最后添加一个元素
rbegin() 返回Vector尾部的逆迭代器
rend() 返回Vector起始的逆迭代器
reserve() 设置Vector最小的元素容纳数量
resize() 改变Vector元素数量的大小
size() 返回Vector元素数量的大小
swap() 交换两个Vector
 
(1)在编写与vector有关的函数时总是会出现如下警告:

--------------------------------------------------------------------

警告信息 warning C4018: 有符号/无符号不匹配

--------------------------------------------------------------------

仔细研究之后发现是进行了与v.size()有关的操作引起的,用其中容器中与size()是被定义为unsigned int 型,而我们在遍历时会用int型导致警告的产生,因此在int 前面添加 unsigned即可。

 
(2)总是出现 vector subscript out of range
在用VC++2008Express Edition 运行插入排序程序时,如果用数组,程序运行正常,而如果改用到vector,就出现vector subscription out of range 异常。
 
  while( v[ pos] >v[ i ]&&pos>=0 )
  改为while( pos>=0&&v[ pos] >v[ i ] )
  while里面是逐死式

  当pos小于0的时候不会执行v[pos]
  v[pos]不是POD类型的数组下标,
  而是vector的[]重载。
  其中pos是size_type类型,好象是unsigned int。
  那么如果当pos为-1是其实是一个越界的正数。

 

(3)vector<pair<int,string> >是什么意思?

    vector<...>容器的<>里需要以个对象类型,pair<int,string>就是一个对象类型,该类型对象有两个数据,first是int型,second是string类型。如可以把一个页码值和该页出现的单词对应起来。把pair<int,string>放入容器vector就是建立了一个pair类型的集合,就能把每一页的内容集合起来写一本字典。

 

(4)sort(Reader.begin(),Reader.end(),compare);  //对阅订者的姓名进行排序输出,没有指明第三个参数的话,按从小到大的顺序排序,有的话,遵循第三个参数(函数)的排序次序。

       reverse (v1.begin( ), v1.end( ) );
      //The original vector v1 is: ( 0 1 2 3 4 5 6 7 8 9 ).
         The modified vector v1 with values reversed is: ( 9 8 7 6 5 4 3 2 1 0 ).
         就是将一个序列反转。。

 

(5)对二维vector的初始化要非常注意,很容易出错(vector out of range)

     对二维vector的每一行初始化时都要先定义个一维vector

    vector<vector<int>> vvINT;  //二维vector

    vector<int> vINT;         //为初始化而定义的一维vector

    vINT.push_back(1);         //第一个二维vector初始化的方法

    vvINT.pushback(vINT);

    vvINT[0].pushback(2);     //第二个二维vector初始化的定义方法

 

    vector<int> v2INT;       //二维vector的第二行开始也要先定义个一维的vector

    v2INT.push_back(3);      

    vvINT[1].push_back(v2INT);

    vvINT[1].push_back(4);


(6)vector中erase用法注意事项

 转自:http://jorgo.blog.163.com/blog/static/130265996201031791920214

vector中的erase方法有些诡异(^_^),稍不注意,就会出错。今天又一次遇到了,就索性总结一下,尤其是在循环体中用erase时,由于vector.begin() vector.end()是变化的,因此就引入了错误的可能性。

vector<int> veci;
veci.push_back(1);
veci.push_back(2);
veci.push_back(3);
veci.push_back(4);
veci.push_back(5);
veci.push_back(3);
veci.push_back(2);
veci.push_back(3);

for(vector<int>::iterator iter=veci.begin(); iter!=veci.end(); iter++)
{
      if( *iter == 3)
             veci.erase(iter);
}

乍一看这段代码,很正常。其实这里面隐藏着一个很严重的错误:当veci.erase(iter)之后,iter就变成了一个野指针,对一个野指针进行 iter++ 是肯定会出错的。

 

查看MSDN,对于erase的返回值是这样描述的:

An iterator that designates the first element remaining beyond any elements removed, or a pointer to the end of the vector if no such element exists

 

于是改代码:

for(vector<int>::iterator iter=veci.begin(); iter!=veci.end(); iter++)
{
      if( *iter == 3)
             iter = veci.erase(iter);
}

这段代码也是错误的:

1)无法删除两个连续的"3"

2)当3位于vector最后位置的时候,也会出错(在veci.end()上执行 ++ 操作)

 

正确的代码应该为:

for(vector<int>::iterator iter=veci.begin(); iter!=veci.end(); )
{
     if( *iter == 3)
          iter = veci.erase(iter);
      else
            iter ++ ;
}

vector中的erase方法效率是很低的,因为为了保持vector中元素在内存空间中的连续性,在删除某个元素之后,需要将其后的元素依次向前移动一个位置,平均复杂度为on)。

 

gcc erase的实现如下:

iterator erase(iterator position) 
{
    if (position + 1 != end())
      copy(position + 1, finish, position); //
 后续元素往前移动
    --finish;
    destroy(finish);   

0 0