std::array
ヒープメモリを回避するために依存する、ハードコーディングされた最大要素数 N を持つデータ構造の消去方法に取り組んでいます。に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 }
はジャンクです)。ここでは SO の例を使用してint
いますが、実際のプログラムには .xml を実装するオブジェクトが格納されています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シフトが適用されているかどうか疑問に思っています