2012-01-17 80 views
-2

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

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

可能想要修复您的格式。 – 2012-01-17 04:37:24

+1

也许你可以发布一个小的,可编辑的例子来显示问题。 – 2012-01-17 04:44:03

+3

这很难理解你的问题,因为代码是不完整的,我们不能编译它。请发布更多代码,以便我们可以使用一些背景信息来帮助您。 – blahman 2012-01-17 04:49:24

回答

1

std::vector::at()需要一个整数参数。具体来说,一个size_t

我不知道ID2是什么类型,但从你给它的代码看起来不是size_t

+0

我正在通过其索引作为整数访问矢量。请回答编辑的问题。 – Onnesh 2012-01-17 05:07:30

+0

填充矢量是相同的http://stackoverflow.com/questions/5293466/c-push-back-inside-a-map-of-vectors – Onnesh 2012-01-17 05:30:42

1

好的,我在工作时启动了虚拟机,并运行了您的代码可能的近似值。你的代码中有些东西我真的不明白。

首先,您是不是打电话到“at”访问vector以外的东西?它是不是零参考?在这种情况下,您可能每次访问vector以外的内容,因此行为未定义?也许尝试在

testString.Format(_T("%f",MaptestITR->second.at(ID2))); 

其次使用0代替ID2,我跑了这种近似,并得到了结果我的预期。也就是说,我不明白为什么你的代码不工作,除了我之前提到的可能的未定义行为。

最后,你能解释一下你的代码试图做什么吗?它似乎只是访问地图内唯一的矢量相同的位置,然后推回很多相同的数字。

如果有人可以给我一个关于如何从VM复制的提示,我也可以发布我在Linux上编译的代码近似值。

...现在,回到工作岗位。

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。始终是来自同一个向量的相同元素。不是因为每个向量元素具有相同的值,所以将哪个元素格式化为字符串非常重要。