访问映射中向量的最后一个元素 (C++)

Accessor to a vector's last element in a map (C++)

我正在尝试将访问器分配给地图中矢量的最后一个元素。我正在做的事情如下;

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。但是,我经常遇到分段违规。所以我想也许我需要初始化 vector 中的 double 所以我将它设置为零但仍然是同样的问题。我怎样才能解决这个问题?谢谢!

在您的示例中,没有您可以访问的 back。向量为空:std::vector<double>()。来自 cppreference

Calling back on an empty container causes undefined behavior.

进一步注意,没有必要使用指向 back 的指针。该方法已经 returns 一个引用(如果该元素存在)。你应该在修改它之前向向量添加一些东西,例如:

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;

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.;