Доступ к последнему элементу вектора на карте (C ++) - PullRequest
0 голосов
/ 05 марта 2020

Я пытаюсь назначить метод доступа к последнему элементу вектора внутри карты. То, что я делаю, выглядит следующим образом:

std::map<std::string, std::vector<double> > test;
test.insert(std::make_pair("smth",std::vector<double>() ));
double* bla = &(test["smth"].back());
(*bla) += 5.

я хочу, в основном, получить доступ к последнему элементу вектора внутри карты и изменить его с помощью средства доступа bla. Тем не менее, я постоянно получаю нарушение сегментации. Поэтому я подумал, что, возможно, мне нужно инициализировать значение double внутри вектора, поэтому я установил его на ноль, но проблема все та же. Как я могу это исправить? Спасибо!

Ответы [ 2 ]

4 голосов
/ 05 марта 2020

В вашем примере нет back, к которому вы могли бы получить доступ. Вектор пуст: std::vector<double>(). С cppreference :

Обратный вызов пустого контейнера вызывает неопределенное поведение.

Также обратите внимание, что нет смысла использовать указатель на back. Метод уже возвращает ссылку (если элемент присутствует). Вы должны добавить что-то в вектор, прежде чем сможете его изменить, например:

std::map<std::string, std::vector<double> > test;
auto x = test.insert(std::make_pair("smth",std::vector<double>() ));
x.first->push_back(0);
x.first->back() += 5;
0 голосов
/ 06 марта 2020

std::vector::back() функция не может использоваться в пустом контейнере. Это означает, что std::vector<double> не должно быть пустым и должно содержать хотя бы одно значение. Другое дело, что в этом случае вы можете использовать более эффективную функцию std::map::emplace_hint, чтобы сделать то же самое, как указано ниже:

 std::map<std::string, std::vector<double> > test;
 test.emplace_hint(test.end(), "smth", 1);
 double* bla = &(test["smth"].back());
 (*bla) += 5.;
...