在這個例子中,我應該根據給定的大小對字串向量進行排序,假設長度大于或等于給定大小的元素首先出現,然后是剩余的。
所以這就是我所做的:
bool is_shorter(std::string const& str, std::string::size_type sz){
return !(str.size() < sz);
}
int main(){
std::vector<string> vstr{"vector", "In", "this", "example", "am", "supposed",
"sort", "a", "of", "I", "strings", "depending"};
std::string::size_type len = 5;
// std::sort( vstr.begin(), vstr.end(),
// std::bind(is_shorter, placeholders::_1, len) );
std::sort( vstr.begin(), vstr.end(),
std::bind( [](std::string const& str, std::string::size_type sz){
return !(str.size() < sz);}, std::placeholders::_1, len ) );
for(auto const& str : vstr)
std::cout << str << ", ";
std::cout << '\n';
std::cout << '\n';
}
輸出:
depending, strings, supposed, example, vector, In, this, am, sort, a, of, I,
如您所見,該程式按我的預期運行良好,但重要且令我困惑的是比較操作是如何進行的:
在里面
sort我猜是這樣的:comp(*it, *it 1); // for simplicity sake only. (I mean two elements of the same sequence -of course same type- are passed-in)
我的意思是比較操作是一個二元操作,它被稱為每個連續元素的每次迭代。這些元素具有相同的型別(序列中的元素)。
那么如何
std::bind將第二個引數更改為std::string::size_type而不是std::string?怎樣才能
std::bind讓操作只需要一次string呢?string傳入的第二個會發生什么?有人可以向我解釋
std::bind這里到底發生了什么嗎?
如果 lambda 傳入或自定義比較操作采用相同型別的引數,我并不重要:
例如對字串向量進行排序,以便與給定字串相等的元素首先出現:
std::sort(vstr.begin(), vstr.end(),
std::bind([](std::string s1, std::string s2 ){ return s1 == s2;}, _1, std::string("vector")
));
- 現在,如果我運行程式,我會在開頭首先出現“向量”這個詞。
uj5u.com熱心網友回復:
問題是,您實際上并不想要sort陣列。(您可以這樣做,通過撰寫一個比較器,true如果第一個字串短于限制而第二個字串長于限制,則回傳該比較器,false否則,效率低下且復雜。)
您想要的是std::partition,它采用一元謂詞,并對陣列重新排序,以便將謂詞回傳的元素true移動到陣列的前面,并將謂詞回傳的false元素移動到陣列的末尾。
一旦您使用采用一元謂詞的演算法,您當前的部分系結方法就可以正常作業。
uj5u.com熱心網友回復:
不完全相關,但您的答案是錯誤的:“依賴,字串,假設,示例,向量,In,this,am,sort,a,of,I,”請注意,“In”在“this”和“sort”之前. 您的排序函式應該比較兩個輸入字串的大小。
現在,對于“系結如何作業?”。基本上,當您呼叫 時std::bind,它會將提供的所有附加引數復制/移動到回傳的資料結構中。這個結構有一個模板化的operator(). 傳遞給的引數operator()代替在std::placeholders呼叫 bind 期間提供的物件。這里的重要部分是呼叫期間傳遞的任何未提及的引數都不會轉發到系結函子。
所以在這種情況下,因為你沒有傳遞std::placeholders:_2給 bind 的呼叫,所以第二個引數被丟棄。lambda 的第二個引數由len您傳入的引數填充。
中有更多功能std::bind,但這涵蓋了最簡單的用例。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/314585.html
