代碼調用 std::partition 時編譯報錯:
沒有找到接受……類型的左操作數的運算符(或沒有可接受的轉換)
vector<string> vec{ "strings", "helloworld", "zay", "uah", "kakaka" };
auto it = partition(vec.cbegin(), vec.cend(), func); // 錯誤行
auto begin = vec.begin();
while (begin != it)
{
cout << *begin << endl;
++begin;
}
vec.cbegin() 返回 const_iterator(只讀迭代器)。std::partition 需要 可寫迭代器(iterator),因為它會交換元素位置。const_iterator 傳給需要修改容器的算法導致類型不匹配。// 將 cbegin()/cend() 改為 begin()/end()
auto it = partition(vec.begin(), vec.end(), func);
// 其餘代碼不變
| 函數 | 返回類型 | 可修改元素 |
|---|---|---|
begin() | iterator | 是 |
end() | iterator | 是 |
cbegin() | const_iterator | 否 |
cend() | const_iterator | 否 |
rbegin() | reverse_iterator | 是 |
crbegin() | const_reverse_iterator | 否 |
cbegin()/cend()(配合 for (const auto& e : vec))。partition、sort、erase)必須用 begin()/end()。std::iterator_traits 檢查迭代器類別。