1

たとえば、STLオブジェクトがあります

std::vector <long> vec1;

これをベクトルに変換したい

std::vector <int> vec2;

使用して

std::map<long,int>map;

vec2 にマップされている vec1 の要素を動的に削除して vec1 のサイズを縮小する効率的な方法はありますか? このアルゴリズムは、メモリの消費量を最小限に抑え、高速にする必要があります。これをその場で行うことは可能ですか?std::remove_if はうまくいきますか? チャンク処理と比較した場合のパフォーマンスはどうですか。つまり、vec1 はチャンクに分割されています。次に、各チャンクがマップされ、vec2 に格納されます。この後、チャンクはメモリから削除されます。

vec1 (および vec2) は、ベクトル (ベクトルのベクトル) の場合もあります。

4

3 に答える 3

1

すでにマップがある場合は、次の(C ++ 11)ソリューションを試すことができます。

std::vector<long> vec1;  // Original vector
std::map<long, int> map; // How to map the `long` value to an `int`

std::vector<int> vec2;  // The destination vector

for (const auto l : vec1)
    vec2.push_back(map[l]);

最初のベクトルがベクトルのベクトルである場合は、ネストされたループを使用するだけです。

for (const auto& v : vec1)
{
    for (const auto l : v)
        vec2.push_back(map[l]);
}
于 2013-03-13T05:27:12.143 に答える
1

vec2 にマップされている vec1 の要素を動的に削除して vec1 のサイズを縮小する効率的な方法はありますか?

a の先頭から何かを削除するvectorと、残りの要素が前方に移動して先頭の空きスペースが埋められるため、非効率的です。また、ベクトルの最後で解放されたメモリは、ヒープに返されません。これは、すべてが一度に解放された 1 つの大きなメモリ ブロックの一部であるためです。

ここでは、デフォルトでデータ構造std::queueを使用する方が適しています。std::dequeこれは一連の小さなメモリ ブロックで構成されます。を使用して、最初にメモリを解放できますpop

#include <queue>

std::queue <long> vec1;
std::queue <int> vec2;

while ( ! vec1.empty() ) {
    vec2.push( value_map[ vec1.front() ] );
    vec1.pop();
}

std::dequeオブジェクトを直接使用することもできます。次に、 and を使用push_frontpop_backます。とてもクールなクラスです。vectorオブジェクトがモノリシックでフラットな配列のように使用されていない場合でも、オブジェクトの「フラットな」シーケンスの錯覚を維持します。

于 2013-03-13T06:22:20.990 に答える
0

要素を宛先ベクトルにコピーするときに、ソース ベクトルから要素を削除できます。

while (!source.empty()) {
  destination.push_back(map[source.back()]);
  source.pop_back();
}

これには、O( n log m ) 時間と O(1) スペースが必要です。ここで、nmです。source.size()map.size()

于 2013-03-13T05:34:15.753 に答える