如何使用copy_if
过滤索引的str
特定倍数。
e.g。 str
是“1000020000300004000050000”,我希望newStr
是“12345”。
根据 1 5 * 0 , 2 5 * 1 , 3 < / strong> 5 * 2 等。
源代码:
std::string str("1000020000300004000050000");
std::string newStr;
std::copy_if(str.begin(), str.end(),
std::back_inserter(newStr),
[] (char c) {
// Some specific rule I want to return.
return ...;
}
);
理想代码:
std::copy_if(str.begin(), str.end(),
std::back_inserter(newStr),
[] (char c) {
// I can get the index of iteration.
return (index % 5 == 0);
}
);
答案 0 :(得分:1)
你可以传递字符串的开头和当前的迭代器作为lambda函数的捕获并相应地使用它们(lambda必须是可变的):
std::string str("1000020000300004000050000");
std::string newStr;
std::copy_if(str.begin(), str.end(),
std::back_inserter(newStr),
[it = str.begin(), beg = str.begin()] (auto c) mutable {
// I can get the index of iteration.
return (std::distance(it++, beg) % 5 == 0);
}
答案 1 :(得分:0)
您可以在本地变量中跟踪索引。请注意,您需要通过引用捕获i
。即[&i]
int i = 0;
std::copy_if(str.begin(), str.end(),
std::back_inserter(newStr),
[&i] (char c) {
int index = i++;
return (index % 5 == 0);
}
);