C++中的向量(Vector)用法(二)

2014-11-24 09:16:24 · 作者: · 浏览: 1
ction继承下来的,允许传递数据作为条件。
  例如,假如想从一个vector;中删除匹配的数据,如果字串中包含了一个值,从这个值开始,从这个值结束。首先应该建立一个数据结构来包含这些数据,类似代码如下:
  #include
  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 {
  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等所有的移出操作都是建立在一个迭代范围上的,不能操作容器中的数据。所以在使用remove,实际上操作的时容器里数据的上面的。
  看到remove实际上是根据条件对迭代地址进行了修改,在数据的后面存在一些残余的数据,那些需要删除的数据。剩下的数据的位置可能不是原来的数据,但他们是不知道的。
  调用erase()来删除那些残余的数据。注意上面例子中通过erase()删除remove的结果和vs.enc()范围的数据。
  常见错误:
  no matching function for call to ‘std::vector,一般由定义的类型与存入的类型不匹配引起。