我有以下代码:
#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的单词,例如?我很困惑,需要一些建议。
答案 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算法。