Вставьте значение в std :: map из кортежа - PullRequest
0 голосов
/ 23 мая 2018

Я просто изучаю структуру данных графа. И я попал в такую ​​ситуацию.
Я написал свой Graph класс, такой как

template <char... Args>
    class Graph{}; 

, где Args типаchar означает вершину моего Graph.Однако, когда я хочу выполнить поиск в моем Графике, мне нужно вставить каждую вершину char и ее индекс в Args как std::pair<char,size_t> в std::map<char,size_t>. Что я сделал, так это то, что построил std::tuple вроде

 std::tuple<decltype(Args)...> t(Args...);

Тогда я хочу сделать вот так

 for(size_t i =0;i<sizeof...(Args);++i)
      Map.insert({0,std::get<i>(t)});

, что на карте означает std::map<size_t,char>.Это, конечно, не работает, потому что i, используемый в std::get<>, не является constexpr.Что я могу сделать сейчас, это вставить по карте одну за другой, например

Map.insert({0,std::get<0>(t)});
Map.insert({1,std::get<1>(t)});
Map.insert({2,std::get<2>(t)});

Но это не тот результат, которого я хочу. Так есть ли другие решения для меня?
Спасибо за любую помощь!

1 Ответ

0 голосов
/ 24 мая 2018

std::map<char,size_t> или std::map<size_t,char>?
Я пойду с std::map<size_t,char>.

Вам нужны C ++ 14's std :: index_sequence 1 .

template <char... Chars, std::size_t... Ints>
void fill_map(std::map<size_t, char> & your_map, std::index_sequence<Ints...>) {
    using swallow = int[];
    (void)swallow{0, (your_map.emplace(Ints, Chars), 0)... };
}

template <char... Chars>
void fill_map(std::map<size_t, char> & your_map) {
    fill_map<Chars...>(your_map, std::make_index_sequence<sizeof...(Chars)>{});
}

использование:

std::map<size_t,char> your_map;
fill_map<Args...>(your_map);

1 реализация для C ++ 11 .

...