我已经创建了一个矢量图并按如下方式填充它。这是代码。我无法发布原始代码。它包含双打矢量
map <int, vector <double> > Maptest;
for (int i = 0 ; i < ID1; i++)
{
for (int j = 0 ; j < ID2; j++)
{
Maptest[i].push_back(j*0.01);
}
}
map <int, vector <double> >::iterator MaptestITR;
CString testString;
for ( j = 0 ; j < ID2; j++)
{
for (i = 0 ; i < ID1; i++)
{
MaptestITR = Maptest.find(i);
if (MaptestITR != Maptest.end())
{
testString.Format(_T("%f",MaptestITR->second.at(j)));
}
myfile << testString<< ',' ;
}
}
但所有值都更新为'0'(testString为'0')。在IDE中,值在Watch中正确显示。
我在这里缺少什么?
答案 0 :(得分:1)
std::vector::at()
需要一个整数参数。具体来说,是size_t
。
我不知道ID2
的类型是什么,但是从您提供的代码看来它似乎不是size_t
。
答案 1 :(得分:1)
好的,我在工作时启动了虚拟机并运行了代码可能的近似值。你的代码中有一些我真的不明白的东西。
首先,您是否打算“访问”vector
以外的内容?是不是零参考?在这种情况下,您可能每次都访问vector
之外的某些内容,因此行为未定义?也许可以在
0
代替ID2
testString.Format(_T("%f",MaptestITR->second.at(ID2)));
其次,我运行了这个近似值,得到了我预期的结果。也就是说,除了我之前提到的可能的未定义行为之外,我不明白为什么你的代码不起作用。
最后,您能否解释一下您的代码尝试做什么?在推回了许多相同的数字之后,它似乎只能访问地图内唯一向量中的相同位置。
如果有人可以给我一个关于如何从VM复制的提示,我也可以发布我在Linux上编译的代码近似值。
......现在,回去工作......
答案 2 :(得分:0)
我认为主要的问题是你的程序没有创建你认为它的map
,并且你的程序没有显示你认为它的矢量项。
出于本答案的目的,我假设标识符ID1
和ID2
是简单的整数变量或宏,它们是简单的整数常量(并且值大于0,或者程序基本上什么都不做)。如果ID1
或ID2
更复杂,那么如果没有关于这些标识符的更多信息,很难推断出该程序应该或可能正在做什么。
让我们仔细看看每个嵌套循环中发生的事情。
在第一个:
Maptest[ID1].push_back(ID2*0.01);
由于map
未被更改,因此使用的ID1
密钥始终相同。所以Maptest
只包含一个项目,其键值为ID1
,并且每个循环迭代都会添加一个向量添加到其中的向量。此外,添加到矢量的每个元素都具有相同的值:(ID2 * 0.01)
。
特别要注意,即使嵌套循环由变量i
和j
控制,这些变量也不会在push_back()
调用中使用。因此,在第一个嵌套循环完成之后,Maptest
包含一个映射,其中包含ID1
的键和包含(ID1 * ID2)
个元素的向量。该向量的每个元素的值都为(ID2 * 0.01)
。
在第二个嵌套循环中,您始终在Maptest
中找到相同的项目 - 具有键ID1
的项目(恰好是map
中的唯一项目) 。该映射的vector<double>
部分有一个带有(ID1 * ID2)
个元素的数组,每个元素都具有相同的值。循环它们将索引ID2
的元素格式化为testString
。始终是同一向量中的相同元素。并不重要的是哪个元素被格式化为字符串,因为每个向量元素具有相同的值。