【问题标题】:how to access map of vectors?如何访问矢量地图?
【发布时间】:2012-01-17 04:35:54
【问题描述】:

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

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 中。

我在这里缺少什么?

【问题讨论】:

  • 可能需要修正您的格式。
  • 也许你可以发布一个小的、可编译的例子来说明问题。
  • 很难理解你的问题,因为代码不完整,我们无法编译。请发布更多代码,以便我们有一些可以用来帮助您的上下文。
  • 另外,我不确定,但我从未在 STL 中看到过名为“CString”的类,尽管我可能记错了。这是来自 MFC 库吗?如果是这样,你能相应地标记它吗?
  • 我真的很抱歉,因为我没有看到代码。我已经更正了代码示例。请参考。顺便说一句,IDE 按照 Watch 的预期显示 MaptestITR 的值,但我无法正确访问它。

标签: c++ stl mfc map vector


【解决方案1】:

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

我不知道ID2 是什么类型,但从您提供的代码来看,它似乎不是size_t

【讨论】:

【解决方案2】:

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

首先,您不是要调用“at”来访问vector 之外的东西吗?它不是零引用吗?在这种情况下,也许您每次都在访问vector 之外的东西,因此没有定义行为?也许尝试使用0 而不是ID2 in

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

其次,我运行了这个近似值,得到了我预期的结果。也就是说,除了我之前提到的可能的未定义行为之外,我不明白为什么您的代码不起作用。

最后,您能解释一下您的代码要做什么吗?在推回许多相同数字之后,它似乎只是访问地图内唯一向量中的相同位置。

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

...现在,回去工作...

【讨论】:

    【解决方案3】:

    我认为主要问题是您的程序没有创建您认为的 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&lt;double&gt; 部分有一个包含(ID1 * ID2) 元素的数组,每个元素都具有相同的值。循环它们将索引ID2 处的元素格式化为testString。始终来自同一向量的相同元素。并不是说将哪个元素格式化为字符串真的很重要,因为每个向量元素都具有相同的值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-24
      • 2011-10-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多