通过boost :: bind从向量中删除字符串

时间:2010-01-16 02:41:05

标签: c++ boost boost-bind

我正在尝试从矢量中删除短字符串。

std::vector<std::string> vec;

// ...

vec.erase(std::remove_if(vec.begin(),
                         vec.end(),
                         boost::bind(std::less<size_t>(),
                                     boost::bind(&std::string::length, _1),
                                     5),
          vec.end());

编译器会发出一条非常大的错误消息:

qwer.cpp:20: error: no matching function for call to 'remove_if(__gnu_cxx::__nor
mal_iterator<std::basic_string<char, std::char_traits<char>, std::allocator<char
> >*, std::vector<std::basic_string<char, std::char_traits<char>, std::allocator
<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::al
locator<char> > > > >, __gnu_cxx::__normal_iterator<std::basic_string<char, std:
:char_traits<char>, std::allocator<char> >*, std::vector<std::basic_string<char,
 std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_strin
g<char, std::char_traits<char>, std::allocator<char> > > > >, boost::_bi::bind_t
<boost::_bi::unspecified, std::less<unsigned int>, boost::_bi::list2<boost::_bi:
:bind_t<unsigned int, boost::_mfi::cmf0<unsigned int, std::basic_string<char, st
d::char_traits<char>, std::allocator<char> > >, boost::_bi::list1<boost::arg<1>
> >, boost::_bi::value<int> > >, __gnu_cxx::__normal_iterator<std::basic_string<
char, std::char_traits<char>, std::allocator<char> >*, std::vector<std::basic_st
ring<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::b
asic_string<char, std::char_traits<char>, std::allocator<char> > > > >)'

以下解决方案有效:

vec.erase(std::remove_if(vec.begin(),
                         vec.end(),
                         boost::bind(&std::string::length, _1) < 5),
          vec.end());

但我仍然很好奇我在第一个版本中做错了什么。谢谢!

1 个答案:

答案 0 :(得分:5)

看起来你的括号已关闭(5之后应该有两个,一个关闭绑定,一个关闭remove_if。)我很惊讶这没有给出关于无效令牌或其他东西的另一个错误消息,因为parens显然是不平衡的(你是否在准备SO时从最后删除了一个额外的关闭?)。看起来就是这种情况,因为如果你在错误消息中读取了remove_if的模板参数,那么最后一个是boost bind_t,接着是另一个gnu :: iterator。