我正在为具有硬编码的最大元素数 N 的数据结构开发一种擦除方法,该方法依赖于std::array
避免堆内存。尽管std::array
仅包含 N 个元素,但其中的某个数量 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_if
和之间std::distance
是总体 O(2M) 或 O(M) ,其中std::remove_if
是更昂贵的操作。但是我不确定是否std::remove_if
是 O(N * M),因为每次删除都会移动元素
编辑:为清楚起见,我知道这应该应用谓词 M 次,但我想知道每次谓词为真时是否应用 N 班次