C++ &引用;矢量下标超出范围“;使用std::vector作为std::map中的值

C++ &引用;矢量下标超出范围“;使用std::vector作为std::map中的值,c++,c++11,vector,C++,C++11,Vector,我有下面的代码,这是我试图做的一个简化版本 std::vector<GLuint> testVector = { 6, 7, 8 }; std::map<std::pair<GLfloat, GLfloat>, std::vector<GLuint>> testMap; testMap.insert(std::make_pair(std::make_pair(1.0f,1.0f), testVector)); std::vector <GL

我有下面的代码,这是我试图做的一个简化版本

std::vector<GLuint> testVector = { 6, 7, 8 };
std::map<std::pair<GLfloat, GLfloat>, std::vector<GLuint>> testMap;
testMap.insert(std::make_pair(std::make_pair(1.0f,1.0f), testVector));

std::vector <GLuint> retrievalVector =
                                  testMap.find(std::make_pair(1.0f, 1.0f))->second;

std::cout << "Retrieval Vector: " << retrievalVector[0] << "\t" 
                                  << retrievalVector[1] << "\t" 
                                  << retrievalVector[2] << std::endl;

retrievalVector.push_back(9);

std::cout << "Retrieval Vector: " << retrievalVector[0] << "\t" 
                                  << retrievalVector[1] << "\t" 
                                  << retrievalVector[2] << "\t" 
                                  << retrievalVector[3] << std::endl;

testMap.insert(std::make_pair(std::make_pair(1.0f, 1.0f), retrievalVector));
retrievalVector = testMap.find(std::make_pair(1.0f, 1.0f))->second;

std::cout << "Retrieval Vector: " << retrievalVector[0] << "\t" 
                                  << retrievalVector[1] << "\t" 
                                  << retrievalVector[2] << "\t" 
                                  << retrievalVector[3] << std::endl;
std::vector testVector={6,7,8};
std::map testMap;
insert(std::make_pair(std::make_pair(1.0f,1.0f),testVector));
向量检索器=
find(std::make_pair(1.0f,1.0f))->秒;

std::cout行为完全符合预期:

如果容器中尚未包含具有等效键的元素,则将元素插入容器中

您已经有了一个
std::make_pair(1.0f,1.0f)
,因此您的返回值应该是:

返回一对,由指向插入元素(或阻止插入的元素)的迭代器和指示插入是否发生的bool组成

如果您选中
testMap.insert(std::make_-pair(std::make_-pair(1.0f,1.0f),retrievalVector))。第二个
应该是
false
,因此那里仍然有一个三元素数组,而不是您希望添加的四元素数组,因此程序在尝试访问
retrievalVector[3]
时崩溃


顺便说一句,C++17有一个函数,可以完成您希望的
insert()
功能。

该功能的行为与预期完全一致:

如果容器中尚未包含具有等效键的元素,则将元素插入容器中

您已经有了一个
std::make_pair(1.0f,1.0f)
,因此您的返回值应该是:

返回一对,由指向插入元素(或阻止插入的元素)的迭代器和指示插入是否发生的bool组成

如果您选中
testMap.insert(std::make_-pair(std::make_-pair(1.0f,1.0f),retrievalVector))。第二个
应该是
false
,因此那里仍然有一个三元素数组,而不是您希望添加的四元素数组,因此程序在尝试访问
retrievalVector[3]
时崩溃


顺便说一句,C++17有一个函数可以完成您希望的
insert()
功能。

问题是,您的第二个
insert
失败,因为您在该位置已经有了一个值。如果要修改该值,必须执行类似于
testMap[std::make_pair(1.0f,1.0f)]=retrievalVector的操作

问题是第二次插入
失败,因为您在该位置已经有了一个值。如果要修改该值,必须执行类似于
testMap[std::make_pair(1.0f,1.0f)]=retrievalVector的操作

浮动是出了名的finnicky,您可能不想在需要精确匹配的关键点上使用它们。这是否可以用
int
代替
GLfloat
?另外,如果你想操纵
retrievalVector
,你可能希望将其声明为引用,而不是副本。除非你非常仔细地进行数值分析,否则使用浮动作为地图的键将在将来给你带来各种痛苦。你不能改用缩放整数吗?浮点数是出了名的finnicky,你可能不想在需要精确匹配的关键点上使用它们。这是否可以用
int
代替
GLfloat
?另外,如果你想操纵
retrievalVector
,你可能希望将其声明为引用,而不是副本。除非你非常仔细地进行数值分析,否则使用浮动作为地图的键将在将来给你带来各种痛苦。你不能改用缩放整数吗?