2012-05-05 25 views
2

請幫我使用下面的代碼。我需要將長度的字符串添加到矢量中。我不知道如何通過提升來實現它。我的最好的辦法,到目前爲止是:加強綁定到矢量的成員函數

boost::bind(add2Vect, boost::ref(lengths), L::_1) 

凡add2Vect是一個簡單的函數,它接受一個載體,一個字符串和字符串的長度添加到載體。 L只是提升的簡寫:: lambda

但是這個解決方案很糟糕,因爲我必須創建一個離散函數。這不是拉姆達斯應該講的。

代碼:

vector<string> strings; 
strings.push_back("Boost"); 
strings.push_back("C++"); 
strings.push_back("Libraries"); 

vector<int> lengths; 

for_each(strings.begin(), strings.end(),  
    // add lengths of strings to the vector 'lengths' 

); 

for_each(lengths.begin(), lengths.end(), 
    cout << L::_1 << " " 
); 
+0

你甚至需要'綁定'或我只是沒有得到什麼。你的'for_each'可以用迭代器循環來代替'strings'和'push_back'ing'it-> length()'到'lengths'。或者,像'std :: transform'這樣的東西可以很好地工作。更好的是,不使用單獨的矢量,而是使用'strings'並調用'length()'而不是有2個副本。 – chris

+0

當然... ;-)這只是一個例子。我只是想知道如何使用** boost:bind,lambda :: bind或其他方式。這是一本書的例子,它應該很容易.. – emesx

回答

2

Boost.Bind和Boost.Lambda是不一樣的東西。除非使用boost :: lambda :: bind,否則不能在綁定中使用lambda佔位符。

這裏是你怎麼做你彷彿想:

std::transform(strings.begin(), strings.end(), std::back_inserter(lengths), 
       boost::bind(&std::string::size, _1)); 

如果你真的必須使用的for_each:

std::for_each(strings.begin(), strings.end(), 
      boost::bind(&std::vector<int>::push_back, 
       &lengths, boost::bind(&std::string::size, _1))); 

,但你應該使用的size_t而不是int類型。

+2

爲什麼你可以在一個綁定表達式中使用一個lambda佔位符,而不是在一個lambda裏面的一個綁定佔位符? – emesx

+0

AFAIK你不能。 –