У меня два std::vector<std::string>
, Один содержит имена полей; другой содержит соответствующие значения. Каков наилучший способ вставить все пары имя-поле / значение в boost :: unordered_map?
Я, конечно, мог получить два итератора для векторов и проходить по циклам, вставляя одну пару на каждую итерацию, но мне было интересно, есть ли более простой способ.
ОБНОВЛЕНИЕ 1: Дополнительная информация: у меня есть g ++ 4.4, так что у меня нет доступа к большинству вкусностей с ++ 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
?
Вы близки. В приведенном выше примере 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));
}
Других решений пока нет …