【问题标题】:removing strings from a vector via boost::bind通过 boost::bind 从向量中删除字符串
【发布时间】:2010-01-16 02:41:04
【问题描述】:

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

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());

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

【问题讨论】:

    标签: c++ boost boost-bind


    【解决方案1】:

    看起来你去掉了括号(5 之后应该有两个,一个用于关闭绑定,一个用于关闭 remove_if。)我很惊讶这并没有给出另一个关于无效令牌或其他东西的错误消息,因为括号明显不平衡(在准备 SO 时,您是否从末尾删除了一个额外的接近括号?)。看起来是这样,因为如果您阅读错误消息中 remove_if 的模板参数,倒数第二个是 boost bind_t,然后是另一个 gnu::iterator。

    【讨论】:

    • 嗯,现在可以编译了吗?仍然看着我..我什至不知道为什么你的第二个“解决方案”甚至可以编译。
    • Bind 重载了一些运算符以加快编写谓词的速度。这是一个非常简洁的功能:boost.org/doc/libs/1_41_0/libs/bind/bind.html#operators
    • 哇。 std::bind 不这样做。
    • boost 在某些方面仍然震撼 C++0x……事情会变得混乱。
    • 看起来 tr1 bind 甚至不正确支持嵌套的 bind 语句(或者至少 tr1 bind 的 VC 实现)。我认为他们比实际更接近..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-02
    相关资源
    最近更新 更多