Member 11807654 Ответов: 1

Как инициализировать словарь в C++?


Здравствуйте, я создал карту на c++, но не знаю, как ее инициализировать. карта выглядит следующим образом:

std::map<int, list<std::tuple<int, int> >> groups;


на самом деле я хочу создать словарь на C++ и поместить элементы с одним и тем же атрибутом в один элемент словаря. например, я хочу поставить кортежи {1,2},{2,2},{2,4} в группах [0] словаря. каково же решение?

Что я уже пробовал:

Я попробовал следующую строчку. но в нем есть ошибка:

groups[0]=(make_tuple(4,4));

1 Ответов

Рейтинг:
9

CPallini

Вы забыли list Попробуйте, например

#include <iostream>
#include <map>
#include <tuple>
#include <list>
using namespace std;


int main()
{
  std::map<int, list<std::tuple<int, int> >> groups;

  groups[0] = list<std::tuple<int,int>>{make_tuple(3,4)};

  cout << get<1>(groups[0].front()) << endl;
}


Philippe Mori

Отсутствует какая-либо нового прежде чем конструктор списка...

Member 11807654

когда я пишу " groups[0] = list<std::tuple<int,int> {make_tuple(3,4)};", это дает ошибку:"имя типа не разрешено", а когда я пишу "groups[0] = new list< std::tuple<int, int> {make_tuple(3,4)};" это дает ошибку:"ошибка C2679: binary '=' : не найден оператор, который принимает правый операнд типа 'std::list< _ty> *' (или нет приемлемого преобразования)"

CPallini

Зачем нам нужно выделять список в куче?

CPallini

Какую версию Visual Studio вы используете?
Такой фрагмент кода компилируется и отлично работает как в Linux с g++ 5.4, так и в Windows с CL 18.00 (Visual Studio 2013).

Member 11807654

visual studio 2012

Member 11807654

Я просто хочу создать словарь, а затем использовать его. есть ли другой способ сделать это?

CPallini

Возможно, такая версия компилятора не поддерживает равномерную инициализацию. Попробуй
#include <iostream>
#включать
#включить & lt;кортеж>
#включить & lt;список>
использование пространства имен std;


тап_п()
{
СТД::МАП&ЛТ;инт, список<СТД::кортеж&ЛТ;инт инт&ГТ; &ГТ;&ГТ; группы;

список<СТД::кортеж&ЛТ;инт инт&ГТ;&ГТ; л = список<СТД::кортеж&ЛТ;инт инт&ГТ;&ГТ;();
l. push_front (make_tuple(3, 4));
группы[0] = l;

соиь <&ЛТ; вам&ЛТ;1&ГТ;(групп[0].стойка()) &ЛТ;< епси;
}

Во всяком случае, я бы использовал более современный компилятор.

Member 11807654

большое спасибо. это прекрасно работает и для меня :)

Philippe Mori

Ну, я не обратил внимания, что это была ценность. Обычно, когда у меня есть такой встроенный контейнер, я бы использовал push_back (или push_front, если требуется обратный порядок), подобный комментарию CPallini ниже. Обычно нет особого смысла заменять весь список целиком, так как обычно вы хотите обновить существующий список.

Member 11807654

Большое спасибо!. согласно вашему объяснению, я должен использовать push_back :)

Member 11807654

извините меня. знаете ли вы, как я могу найти максимум вторых значений в одном элементе словаря? Например, если группы[0] этого словаря имеют кортежи {2,3},{4,2}, {5,7}, я хочу найти max{3,2,7}=7.