1

私は2つ持っていstd::vector<std::string>ます。1 つはフィールド名を含みます。もう 1 つは対応する値を含みます。すべてのフィールド名/値のペアをboost::unordered_mapに挿入する最良の方法は何ですか?

確かに、ベクトルで 2 つの反復子を取得し、反復ごとに 1 つのペアを挿入してループスルーすることはできましたが、もっと簡単な方法はないかと考えました。

更新 1 : 追加情報: g++ 4.4を使用しているため、ほとんどの c++11 グッズにアクセスできません。

更新 2 : @chris の提案に基づいて、使用しようとしていますboost::iterator。私が使用している Boost ドキュメントの例を次に示します。

std::vector<double>::const_iterator beg1 = vect_of_doubles.begin();
std::vector<double>::const_iterator end1 = vect_of_doubles.end();
std::vector<int>::const_iterator beg2 = vect_of_ints.begin();
std::vector<int>::const_iterator end2 = vect_of_ints.end();

std::for_each(
  boost::make_zip_iterator(
    boost::make_tuple(beg1, beg2)
    ),
  boost::make_zip_iterator(
    boost::make_tuple(end1, end2)
    ),
  zip_func()
  );
A non-generic implementation of zip_func could look as follows:

struct zip_func :
  public std::unary_function<const boost::tuple<const double&, const int&>&, void>
{
  void operator()(const boost::tuple<const double&, const int&>& t) const
  {
    m_f0(t.get<0>());
    m_f1(t.get<1>());
  }

private:
  func_0 m_f0;
  func_1 m_f1;
};

の定義まで理解できましたzip_func()。どこにstruct住むべきですか?何かを返す必要がありますか?なぜあるのoperator()ですか?あまりにも多くのことが起こっていて、頭を整理することができません。私の問題では、どのようzip_func()にフィールド名と値を抽出して挿入しunordered_mapますか?

4

1 に答える 1

2

あなたは近くにいます。上記の例では、zip_func は、必要な作業を行う、提供するファンクターです。この場合、次のようなものです。

typedef unordered_map<string,string> stringmap;

struct map_insertor {
    void operator()(const boost::tuple<const string&, const string&> &t ) {
        m_map.insert(make_pair(t.get<0>(),t.get<1>());
    }
    map_insertor(stringmap &m) : m_map(m) {}
    private:
        stringmap &m_map;
};

stringmap my_map;
for_each( 
    boost::make_zip_iterator(
        boost::make_tuple(beg1, beg2)
    ),
    boost::make_zip_iterator(
        boost::make_tuple(end1, end2)
    ),
    map_insertor(my_map)
);

しかし、単純な解決策には何の問題もありません。

typedef vector<string> stringvec;

stringvec::iterator ik = vec_of_keys.begin();
stringvec::iterator iv = vec_of_vals.begin();
for( ;(ik != vec_of_keys.end()) && (iv != vec_of_vals.end()); ik++,iv++) {
  my_map.insert(make_pair(*ik, *iv));
}
于 2013-08-09T22:47:26.137 に答える