是否有标准算法或它们的组合来有条件地替换相邻的重复值?

问题描述 投票:0回答:1

功能规格

如果向量中的值相邻重复超过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] << " ";
    }
}

性能至关重要,因此最好避免过度工作。 (向量预计足够大,千兆字节)。

我将使用执行策略,因此范围的使用存在疑问。

c++ search replace std
1个回答
0
投票

怎么样:

v.erase(std::unique(std::begin(v), std::end(v)), std::end(v));
© www.soinside.com 2019 - 2024. All rights reserved.