2

要素の構造体であるベクトルのすべての要素をセットにコピーするにはどうすればよいですか。

    struct info
    {
      std::string code;
      std::string curDate;
      int         iVar;

    };

    std::vector<info> infVect; // Load data into the vector from the database

    std::set<std::string> uniqueCodes;


  for ( int i = 0; i < infVect.size() ; ++i)
      uniqueCodes.insert(infVect[i].code);

ループ内の各要素を反復せずに、ベクトルからセットに要素を格納するより高速な方法はありますか?

ノート:

std::set<std::string> uniqueCodes(infVect.begin(), infVect.end() )、コードのみがあれば機能infVectします。しかしinfVect、オブジェクトのベクトルです。

4

2 に答える 2

9

あなたのコードは絶対に問題ありません。forループは、この状況で何を意味するかを表現する最も簡単な方法です。C++11 の範囲ベースforはさらに単純です。

for (const auto& i : infVect)
  uniqueCodes.insert(i.code);

代替手段が必要な場合は、STL 機能を接着するだけで実現する方法を次に示します。

実行してstd::transformメンバーを抽出し、 に挿入しsetます。mem_fnヘルパーは、メンバー関数またはメンバー変数をファンクターに変換します。

std::transform(
  infVect.begin(),
  infVect.end(),
  std::inserter(uniqueCodes, uniqueCodes.end()),
  std::mem_fn(&info::code)
);

プライベートの場合codeは、に渡すゲッターが必要ですmem_fn

const std::string& getCode() const { return code; }

次のヘッダーが必要です。

#include <algorithm>  // transform
#include <functional> // mem_fn
#include <iterator>   // inserter

元の を保持することを気にしない場合は、C++11 で をvector使用して、再割り当てなしで文字列を移動し、ラムダを使用してへの依存を回避できます。std::move_iterator<functional>mem_fn

using namespace std; // for brevity
transform(
  make_move_iterator(begin(infVect)),
  make_move_iterator(end(infVect)),
  inserter(uniqueCodes, end(uniqueCodes)),
  [](info&& x) { return move(x.code); }
);
于 2013-06-12T18:46:37.537 に答える
1

すべてのノードにアクセスする必要がありますが、反復を隠すことができますstd::transform

struct StringFromInfo { std::string operator()(const Info& info) { return info.code; } };

std::transform(infVect.begin(), infVect.end(), std::back_inserter(uniqueCodes), StringFromInfo());
于 2013-06-12T18:43:22.530 に答える