如何使用`copy_if`过滤索引的`str`特定倍数

时间:2016-10-17 22:58:55

标签: c++ c++11

如何使用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);
    }
);

2 个答案:

答案 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);
}

DEMO

答案 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);
    }
);