1.任何改变vector长度的操作都会使已经存在的迭代器失效

vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。

  为了可以使用vector,必须在你的头文件中包含下面的代码:

  #include <vector>

  vector属于std命名域的,因此需要通过命名限定,如下完成你的代码:

  using std::vector;

  vector<int> vInts;

  或者连在一起,使用全名:

  std::vector<int> vInts;

  建议使用全局的命名域方式:using namespace std;

  函数

  表述

  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.size()

  返回容器中数据个数。

  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>

  cvector<Elem> c1(c2)

  vector <Elem> c(n)

  ector <Elem> c(n, elem)

  vector <Elem> c(beg,end)

  c.~ vector <Elem>()

  创建一个空的vector。复制一个vector。创建一个vector,含有n个数据,数据均已缺省构造产生。创建一个含有n个elem拷贝的vector。创建一个以[beg;end)区间的vector。销毁所有数据,释放内存。

  operator[]

  返回容器中指定位置的一个引用。

  创建一个vector

  vector容器提供了多种创建方法,下面介绍几种常用的。

  创建一个Widget类型的空的vector对象:

  vector<Widget> vWidgets;

  创建一个包含500个Widget类型数据的vector:

  vector<Widget> vWidgets(500);

  创建一个包含500个Widget类型数据的vector,并且都初始化为0:

  vector<Widget> vWidgets(500, Widget(0));

  创建一个Widget的拷贝:

  vector<Widget> vWidgetsFromAnother(vWidgets);

  向vector添加一个数据

  vector添加数据的缺省方法是push_back()。push_back()函数表示将数据添加到vector的尾部,并按需要来分配内存。例如:向vector<Widget>中添加10个数据,需要如下编写代码:

  for(int i= 0;i<10; i++) {

  vWidgets.push_back(Widget(i));

  }

  获取vector中制定位置的数据

  vector里面的数据是动态分配的,使用push_back()的一系列分配空间常常决定于文件或一些数据源。如果想知道vector存放了多少数据,可以使用empty()。获取vector的大小,可以使用size()。例如,如果想获取一个vector v的大小,但不知道它是否为空,或者已经包含了数据,如果为空想设置为-1,你可以使用下面的代码实现:

  int nSize = v.empty() ? -1 : static_cast<int>(v.size());

  访问vector中的数据

  使用两种方法来访问vector。

  1、 vector::at()

  2、 vector::operator[]

  operator[]主要是为了与C语言进行兼容。它可以像C语言数组一样操作。但at()是我们的首选,因为at()进行了边界检查,如果访问超过了vector的范围,将抛出一个例外。由于operator[]容易造成一些错误,所有我们很少用它,下面进行验证一下:

  分析下面的代码:

  vector<int> v;

  v.reserve(10);

  for(int i=0; i<7; i++) {

  v.push_back(i);

  }

  try {int iVal1 = v[7];

  // not bounds checked - will not throw

  int iVal2 = v.at(7);

  // bounds checked - will throw if out of range

  } catch(const exception& e) {

  cout << e.what();

  }

  删除vector中的数据

  vector能够非常容易地添加数据,也能很方便地取出数据,同样vector提供了erase(),pop_back(),clear()来删除数据,当删除数据时,应该知道要删除尾部的数据,或者是删除所有数据,还是个别的数据。

  Remove_if()算法 如果要使用remove_if(),需要在头文件中包含如下代码::

  #include <algorithm>

  Remove_if()有三个参数:

  1、 iterator _First:指向第一个数据的迭代指针。

  2、 iterator _Last:指向最后一个数据的迭代指针。

  3、 predicate _Pred:一个可以对迭代操作的条件函数。

  条件函数

  条件函数是一个按照用户定义的条件返回是或否的结果,是最基本的函数指针,或是一个函数对象。这个函数对象需要支持所有的函数调用操作,重载operator()()操作。remove_if()是通过unary_function继承下来的,允许传递数据作为条件。

  例如,假如想从一个vector<CString>中删除匹配的数据,如果字串中包含了一个值,从这个值开始,从这个值结束。首先应该建立一个数据结构来包含这些数据,类似代码如下:

  #include <functional>

  enum findmodes {

  FM_INVALID = 0,

  FM_IS,

  FM_STARTSWITH,

  FM_ENDSWITH,

  FM_CONTAINS

  };

  typedef struct tagFindStr {

  UINT iMode;

  CString szMatchStr;

  } FindStr;

  typedef FindStr* LPFINDSTR;

  然后处理条件判断:

  class FindMatchingString : public std::unary_function<CString, bool> {

  public:

  FindMatchingString(const LPFINDSTR lpFS) :

  m_lpFS(lpFS) {

  }

  bool operator()(CString& szStringToCompare) const {

  bool retVal = false;

  switch (m_lpFS->iMode) {

  case FM_IS: {

  retVal = (szStringToCompare == m_lpFDD->szMatchStr);

  break;

  }

  case FM_STARTSWITH: {

  retVal = (szStringToCompare.Left(m_lpFDD->szMatchStr.GetLength())

  == m_lpFDD->szWindowTitle);

  break;

  }

  case FM_ENDSWITH: {

  retVal = (szStringToCompare.Right(m_lpFDD->szMatchStr.GetLength())

  == m_lpFDD->szMatchStr);

  break;

  }

  case FM_CONTAINS: {

  retVal = (szStringToCompare.Find(m_lpFDD->szMatchStr) != -1);

  break;

  }

  }

  return retVal;

  }

  private:

  LPFINDSTR m_lpFS;

  };

  通过这个操作你可以从vector中有效地删除数据:

  FindStr fs;

  fs.iMode = FM_CONTAINS;

  fs.szMatchStr = szRemove;

  vs.erase(std::remove_if(vs.begin(), vs.end(), FindMatchingString(&fs)), vs.end());

  Remove(),remove_if()等所有的移出操作都是建立在一个迭代范围上的,不能操作容器中的数据。所以在使用remove_if(),实际上操作的时容器里数据的上面的。

  看到remove_if()实际上是根据条件对迭代地址进行了修改,在数据的后面存在一些残余的数据,那些需要删除的数据。剩下的数据的位置可能不是原来的数据,但他们是不知道的。

  调用erase()来删除那些残余的数据。注意上面例子中通过erase()删除remove_if()的结果和vs.enc()范围的数据。

STL_vector的更多相关文章

  1. stl_vector.h

    stl_vector.h // Filename: stl_vector.h // Comment By: 凝霜 // E-mail: mdl2009@vip.qq.com // Blog: http ...

  2. SGI STL源码stl_vector.h分析

    前言 vector 是最常用的 C++ 容器,其动态扩容的特性是普通数组不具备的,这大大增加了编程的灵活性.虽然平时用 vector 很多,也能基本理解其原理,但无法从深层次理解.直到研读了 vect ...

  3. STL源代码剖析 容器 stl_vector.h

    本文为senlie原创.转载请保留此地址:http://blog.csdn.net/zhengsenlie vector --------------------------------------- ...

  4. 学习:STL_vector容器

    vector基本概念: 功能: vector数据结构和数组非常相似,也称为单端数组 vector与普通数组区别: 不同之处在于数组是静态空间,而vector可以动态扩展 动态扩展: 并不是在原空间之后 ...

  5. stl_vector复习

    #include <iostream>#include <vector>#include <algorithm> //for_each#include <ct ...

  6. STL_Vector(向量)

    向量Vector 头文件 #include<vector> 作用: vector是一种顺序容器,与数组类似,但与之不同的是vector并不需要开辟内存空间,其类似于每存一个变量便开一个空间 ...

  7. 标准模板库(STL)的一个 bug

    今天敲代码的时候遇到 STL 的一个 bug,与 C++ 的类中的 const 成员变量有关.什么,明明提供了默认的构造函数和复制构造函数,竟然还要类提供赋值运算符重载.怎么会这样? 测试代码 Tes ...

  8. Linux覆盖率一点研究:获取覆盖率数据

     首先,当然哥不介意你鄙视我在网上找的资料研究! 白盒覆盖率是啥东东这个问题大家自己查百度啦!我也不太懂,就知道它不是个东西,就这样开始吧(MT一般是先摸四蹄呢还是先黑金币呢?这是个问题)! 首先:l ...

  9. STL源代码剖析 容器 stl_hashtable.h

    本文为senlie原创.转载请保留此地址:http://blog.csdn.net/zhengsenlie hashtable ------------------------------------ ...

随机推荐

  1. ssh链接云主机的一些笔记

    在window下 试了好几个ssh软件后用了putty,因为它免费而且中文不乱码 1.实现自动登陆功能 用快捷方式实现自动登陆 首先创建putty.exe的快捷方式到桌面:然后运行putty,输入ho ...

  2. NYOJ-571 整数划分(三)

    此题是个非常经典的题目,这个题目包含了整数划分(一)和整数划分(二)的所有情形,而且还增加了其它的情形,主要是用递归或者说是递推式来解,只要找到了递推式剩下的任务就是找边界条件了,我觉得边界也是非常重 ...

  3. Debugging Failed Because Integrated Windows Authentication Is Not Enabled

    To enable integrated Windows authentication Log onto the Web server using an administrator account. ...

  4. Android Studio 将工程作为第三方类库的步骤

    一.将工程的module名称修改为自己要添加的类库名称 1.选中module文件夹右键到Rename项 2.选中Rename module项 3.修改为自己的名称,如VolleyLibary 二.修改 ...

  5. Android学习手记(2) Activity生命周期

    1. 单个Activity的生命周期 当只有一个Activity的时候, 首先执行onCreate->onStart->onResume. 这时, 窗口便显示在屏幕上了. 然后我们按返回键 ...

  6. c-整型家族(integer family)

    C中,整型有: characters, short integer, integer, long integer 看起来,long integer要比short integer大,但是这也是不一定的. ...

  7. iOS中解析 XML / JSON

    JSON数据格式 1. 概述: JSON (JavaScript Object Notation) 是⼀一种轻量级的数据交换格式 基于⽂文本格式,易于⼈人阅读和编写,同时也易于机器解析和⽣生成. 2. ...

  8. 如何通过Request.ServerVariables["HTTP_USER_AGENT"]获取客户端操作系统信息

    http://www.useragentstring.com/pages/api.php

  9. 武汉科技大学ACM :1002: 零起点学算法66——反话连篇

    Problem Description 把输入的字符按照反着顺序输出 Input 多组测试数据  每组一行(每组数据不超过200个字符) Output 按照输入的顺序反着输出各个字符 Sample I ...

  10. 武汉科技大学ACM :1003: 零起点学算法14——三位数反转

    Problem Description 水题 Input 输入1个3位数(题目包含多组测试数据) Output 分离该3位数的百位.十位和个位,反转后输出(每组测试数据一行) Sample Input ...