2010-01-16 78 views
4

從矢量中刪除字符串我試圖從矢量中刪除短字符串。通過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()); 

但是,我還是好奇,我在第一次做錯了版。謝謝!

回答

5

它看起來像你取消了括號(應該有兩個5之後,一個關閉綁定,一個關閉remove_if)。我很驚訝這並沒有給出關於無效令牌或其他東西的錯誤消息,因爲父母顯然是不平衡的(你在準備SO時是否從最後移除了一個額外的父母?)。它看起來就是這樣,因爲如果你在錯誤消息中讀取了remove_if的模板參數,那麼接下來的是一個boost bind_t,接着是另一個gnu :: iterator。

+0

洛爾謝謝,這是一個愚蠢的錯誤。 – fredoverflow 2010-01-16 02:55:48

+0

恩,所以現在編譯?仍然看着我......我甚至不知道爲什麼你的第二個「解決方案」甚至編譯。 – 2010-01-16 03:34:13

+3

綁定使一些運算符重載,從而更快地編寫謂詞。這是一個非常整潔的功能:http://www.boost.org/doc/libs/1_41_0/libs/bind/bind.html #operators – 2010-01-16 03:52:27