如何访问矢量地图?

时间:2012-01-17 04:35:54

标签: c++ stl mfc map vector

我已经创建了一个矢量图并按如下方式填充它。这是代码。我无法发布原始代码。它包含双打矢量

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中正确显示。

我在这里缺少什么?

3 个答案:

答案 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,并且你的程序没有显示你认为它的矢量项。

出于本答案的目的,我假设标识符ID1ID2是简单的整数变量或宏,它们是简单的整数常量(并且值大于0,或者程序基本上什么都不做)。如果ID1ID2更复杂,那么如果没有关于这些标识符的更多信息,很难推断出该程序应该或可能正在做什么。

让我们仔细看看每个嵌套循环中发生的事情。

在第一个:

Maptest[ID1].push_back(ID2*0.01);

由于map未被更改,因此使用的ID1密钥始终相同。所以Maptest只包含一个项目,其键值为ID1,并且每个循环迭代都会添加一个向量添加到其中的向量。此外,添加到矢量的每个元素都具有相同的值:(ID2 * 0.01)

特别要注意,即使嵌套循环由变量ij控制,这些变量也不会在push_back()调用中使用。因此,在第一个嵌套循环完成之后,Maptest包含一个映射,其中包含ID1的键和包含(ID1 * ID2)个元素的向量。该向量的每个元素的值都为(ID2 * 0.01)

在第二个嵌套循环中,您始终在Maptest中找到相同的项目 - 具有键ID1的项目(恰好是map中的唯一项目) 。该映射的vector<double>部分有一个带有(ID1 * ID2)个元素的数组,每个元素都具有相同的值。循环它们将索引ID2的元素格式化为testString。始终是同一向量中的相同元素。并不重要的是哪个元素被格式化为字符串,因为每个向量元素具有相同的值。