карта — C ++: вставка в boost :: unordered_map из ключей и векторов значений

У меня два 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?

1

Решение

Вы близки. В приведенном выше примере 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));
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]