使用equal_to函数对象在向量中查找字符串

时间:2012-03-12 16:05:58

标签: c++ stl

我有以下代码:

#include <iostream>
#include <fstream>
#include <algorithm>
#include <iterator>
#include <vector>
#include <functional>

using namespace std;

typedef istream_iterator<string> is_it;
typedef vector<string>::iterator v_str_it;

int main()
{
    int i = 4;
    ifstream ifstr("1.txt");
    is_it ifstrm(ifstr);
    is_it eof;
    vector<string> v_str(ifstrm, eof);
    v_str_it vsit = v_str.begin();
    while( (vsit = find_if(vsit, v_str.end(),
        bind2nd(equal_to<string>(), i ))) != v_str.end())
    {
        cout << *vsit << endl;
        ++vsit;
    }
    return 0;
}

据我所知find_if(vsit, v_str.end(), bind2nd(equal_to<string>(), i ),我应该const char使用"sometext"代替int i。但是我怎样才能找到长度等于4的单词,例如?我很困惑,需要一些建议。

1 个答案:

答案 0 :(得分:0)

find_if只会返回满足谓词的序列中的第一项。

为此你真的想要一个lambda,如果你使用的是C ++ 11。这看起来像是:

[](std::string const& x) { return x.size() == i; }

(不确定确切的语法)。

要创建一个最简单的“仿函数”,您可以这样做:

struct CompareStringLength
{
   int len_;
   explicit CompareStringLength( int len ) : len_(len)
   {
   }

   bool operator()(std::string const& str ) const
   {
      return str.size() == len_;
   }
};

在你的矢量中,你现在可以使用std::find_if( v.begin(), v.end(), CompareStringLength(i) );

获取第一个元素。要查找所有这些内容,没有std::copy_if将它们复制到另一个向量中,因此您实际上必须创建一个返回相反的谓词,并使用确实存在的remove_copy_if或编写您自己的copy_if算法。