我有两个std::vector<std::string>
。一个包含字段名称;另一个包含相应的值。将所有fieldname / value对插入boost :: unordered_map的最佳方法是什么?
我当然可以在向量上获得两个迭代器并循环遍历,在每次迭代中插入一对,但我想知道是否有更简单的方法。
更新1 :其他信息:我有 g ++ 4.4 ,所以我无法访问大多数c ++ 11好东西。
更新2 :根据@ chris的建议,我尝试使用boost::iterator
。以下是我正在使用的示例from the Boost documentation:
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
?
答案 0 :(得分: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));
}