4

コンテナから一意の要素のみを取得しようとしていました。srcContainerは、一意の要素が必要なコンテナーだとしましょう。私は3つのオプションを見ました:

  1. std::unique の使用

       std::sort(srcContainer.begin(), srcContainer.end());
       srcContainer.erase(std::unique(srcContainer.begin(), srcContainer.end()), srcContainer.end());
    
  2. BOOST::unique の使用

    boost::erase(srcContainer, boost::unique<boost::return_found_end>(boost::sort(srcContainer)));  
    
  3. 私独自の方法

    std::set<T> uniqueElems(srcContainer.begin(), srcContainer.end());  
    srcContainer.clear();  
    srcContainer.insert(srcContainer.end(), uniqueElems.begin(), uniqueElems.end()); 
    

1. と 2. の問題は、元の srcContainer でメンバーが発生する順序が変更されることです。3.では順序に変化がなく、さらに上記の1.や2に比べてはるかに優れたパフォーマンスが得られます(3.では明示的なソートがないためですか??)。上記の 3 つのメソッドの経過時間と srcContainer の要素数を以下に示します。

  1. srcContainer のサイズ (整数を含む) = 1e+6
    - std::unique = 1.04779 秒
    - BOOST::unique = 1.04774 秒
    - 独自のメソッド = 0.481638 秒

  2. srcContainer のサイズ (整数を含む) = 1e+8
    - std::unique = 151.554 秒
    - BOOST::unique = 151.474 秒
    - 独自のメソッド = 57.5693 秒

私の質問は:

  1. std::unique または BOOST::unique またはその他のコードを使用して一意を見つけ、コンテナ内の元の順序を維持するより良い方法はありますか?
  2. 上記の方法 3. の使用に関する問題。

パフォーマンス プロファイリングについてsrcContainerは、次のように作成されました。

std::vector<int> srcContainer;  
int halfWay = numElems/2;  
for (size_t k=0; k<numElems; ++k) {  
   if (k < halfWay)  
      srcContainer.push_back(k);  
   else  
      srcContainer.push_back(k - halfWay);  
}  

編集:
メソッド 3. も要素の順序を変更するというコメントに同意します。順序を変更せずに一意の要素を取得するより良い方法はありますか?

ありがとう

4

1 に答える 1