【发布时间】:2019-02-08 13:11:18
【问题描述】:
void Print (vector<pair<int, string>> v) {
for(auto& p : v) {
auto[_int, _str] = Unpack(p);
cout << p.first << " " << p.second << endl;
}
}
int main()
{
vector<pair<int, string>> v = {{1,"b"}, {2, "z"}, {1, "a"}};
Print(v);
/*
1 b
2 z
1 a
*/
auto predicate = [](const int _int, const string _str) {
return _int != 1 || _str == "b";
};
auto it = remove_if(begin(v), end(v), predicate);
v.erase(it, end(v));
Print(v);
/* I want:a
1 a
*/
}
这是 Yandex 的 C++ 课程的一部分:coursera link
谓词是预定义的,我无法更改。这是一个带有 2 个参数的 lambda 函数。一切都表明我应该将此谓词用作 remove_if 函数的一部分。
如何将两个参数传递给谓词?
我试过了:
auto it = remove_if(begin(v), end(v), predicate(auto[_int, _str] = Unpack(p)));
但它不起作用... 有任何想法吗? 提前谢谢!
【问题讨论】:
-
使用第二个带有单个参数的 lambda,并调用第一个 lambda?使用
std::bind设置参数之一? -
你的向量持有一个
std::pair<int, string>,所以这就是谓词应该采用的。auto predicate = [](const std::pair<int, string>& v) { return v.first != 2 && v.second != "b"; }; -
为什么要摆弄元组,对就足够了?
-
@Someprogrammerdude 你真棒
-
@Deduplicator,是的,你是对的
标签: c++ algorithm tuples predicate yandex