我正在尝试将访问器分配给映射内向量的最后一个元素。我正在做的事情如下;
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,因此将其设置为零,但仍然是同样的问题。我怎样才能解决这个问题?谢谢!
答案 0 :(得分:4)
在您的示例中,没有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;
答案 1 :(得分:0)
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.;