功能规格
如果向量中的值相邻重复超过repetitions次,并且该值未被某些谓词排除,请将所有重复值替换为新的指定值。
请查看功能齐全的演示。
请不要太关注代码,无需对其进行优化,仅用于说明目的。
问题
有没有一种方法可以使用其中一种组合来用 C++ 标准库算法来表达这一点,以使此代码更加通用并避免重新发明轮子?
代码
#include <iostream>
#include <vector>
bool pred(int value) { const int excluder = 1; return value == excluder; }
void replace_repeating(int* first, int* last, const auto& pred, size_t repetitions, int replacement) {
size_t count = 0;
for (; first < last; ++first) {
if (first != last && *first == *(first+1)) {
count++;
}
else {
if (count >= repetitions && !pred(*first)) {
std::fill(first - count +1 , first +1, replacement);
}
count = 1;
}
}
}
int main() {
std::vector<int> v = { 1, 1, 1, 7, 7, 7, 7, 3, 3, 4, 4, 5, 6, 6, 6 };
size_t repetitions = 3;
int replacement = 0;
replace_repeating(v.data(), v.data()+v.size(), pred, repetitions, replacement);
for (size_t i = 0; i < v.size(); i++) {
std::cout << v[i] << " ";
}
}
性能至关重要,因此最好避免过度工作。 (向量预计足够大,千兆字节)。
我将使用执行策略,因此范围的使用存在疑问。
怎么样:
v.erase(std::unique(std::begin(v), std::end(v)), std::end(v));