gpt4 book ai didi

c++ - std::remove_if 的渐近复杂度

转载 作者:行者123 更新时间:2023-11-30 00:46:20 25 4
gpt4 key购买 nike

我正在为具有硬编码最大元素数 N 的数据结构开发一种删除方法,它依赖于 std::array 来避免堆内存。虽然 std::array 只包含 N 个元素,但只有 M 个元素,其中 M 是“相关”元素,其中 M 小于或等于 N。例如,如果 N 为 10 且数组看起来像这样:

std::array<int, N> elements = { 0, 1, 2, -1, 4, -1, 6, -1, -1, 9 };

...如果 M 是 7,则只有前 7 个元素是“相关的”,而其他元素被认为是垃圾(结尾 { -1, -1, -9 } 是垃圾) .我在此处使用 int 作为 SO 示例,但实际程序存储实现 operator== 的对象。下面是一个删除所有 -1 并更新 M 的工作示例:

#include <algorithm>
#include <array>
#include <iostream>

constexpr unsigned N = 10;
unsigned M = 7;
std::array<int, N> elements = { 0, 1, 2, -1, 4, -1, 6, -1, -1, 9 };

int main() {
for (unsigned i = 0; i < M; ++i)
std::cout << elements[i] << ' ';
std::cout << '\n';

auto newEnd = std::remove_if(
std::begin(elements), std::begin(elements) + M,
[](const auto& element) {
return -1 == element;
}
);

unsigned numDeleted = M - std::distance(std::begin(elements), newEnd);
M -= numDeleted;
std::cout << "Num deleted: " << numDeleted << '\n';

for (unsigned i = 0; i < M; ++i)
std::cout << elements[i] << ' ';
std::cout << '\n';

return 0;
}

我的问题是 std::remove_if 的渐近复杂度是多少?我想在 std::remove_ifstd::distance 之间它是整体 O(2M) 或 O(M) 其中 std::remove_if 是一个更昂贵的操作。但是我不确定 std::remove_if 是否为 O(N * M),因为每次删除都会移动元素

编辑:为清楚起见,我知道这应该应用谓词 M 次,但我想知道每次谓词为真时是否应用 N 次转换

最佳答案

通过 cppreference :

Complexity: Exactly std::distance(first, last) applications of the predicate.

被移除的元素没有移位操作,因为它们在调用 std::remove_if 后可能具有未指定的值

关于c++ - std::remove_if 的渐近复杂度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38888171/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com