удаление строк из вектора с помощью boost :: bind - PullRequest
4 голосов
/ 16 января 2010

Я пытаюсь удалить короткие строки из вектора.

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 Ответ

5 голосов
/ 16 января 2010

Похоже, вы сняли круглые скобки (должно быть два после 5, один, чтобы закрыть привязку, один, чтобы закрыть remove_if.) Я удивлен, что это не выдало еще одно сообщение об ошибке о недействительном токене или чем-то еще, так как парены явно неуравновешены (вы удаляли лишнего парня с конца во время подготовки к SO?). Похоже, что это так, потому что если вы прочитали аргументы шаблона для remove_if в сообщении об ошибке, то рядом с последним будет boost bind_t, за которым следует другой gnu :: iterator.

...