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
,你可能希望将其声明为引用,而不是副本。除非你非常仔细地进行数值分析,否则使用浮动作为地图的键将在将来给你带来各种痛苦。你不能改用缩放整数吗?