【问题标题】:C++ - Stl - map to int table [closed]C++ - Stl - 映射到 int 表 [关闭]
【发布时间】:2013-11-26 20:15:14
【问题描述】:

我刚开始学习 C++,现在正在编写一个简单的程序,能够读取日志文件(例如 Apache)并提供一些信息,但我无法使用地图来存储数据。 我正在使用地图的地图,就像这样:

typedef map<string, int[25]> ReferTimes;
map <string, ReferTimes> myMap;

我需要访问表 int[25](每个 case 用 0 初始化)并根据给定参数的值增加单个 case 的值。每个案例对应一个时间片(第一个案例 = 00 到 01,第二个案例 = 01 到 02 ...倒数第二个案例 = 23 到 24)但最后一个案例,即之前案例的相加(计算多少次页面已被点击)。

ReferTimes 字符串对应于用户需要另一个页面的互联网页面,即 myMap 的键。

所以:我将用户需要的每个页面都关联到每个需要的页面,并且我将表格与他们关联起来,以了解一个页面被点击的时间和次数。

我的问题是我无法访问这些表来更改它们的值。你能给我一点帮助吗?

我知道它没有很好地解释,但我希望你能帮助我!

【问题讨论】:

  • 您是如何尝试修改它们的值的?
  • 我尝试了类似 myMap.insert(make_pair("exemple1", make_pair("exemple2", int[25])) 但显然它不起作用。我会尝试使用矢量(仅添加)。要修改值,我不知道如何访问此向量,以更改单个案例的值。

标签: c++ arrays dictionary stl


【解决方案1】:

首先 - 修复代码

首先也是最重要的:您不能在 STL 容器中存储简单的数组。但是,您可以将 std::vectorpointer 存储到数组(或普通指针)。

因此,为了能够做任何事情,您需要将ReferTimes 的定义更改为:typedef map&lt;string, int(*)[25]&gt; ReferTimes;

然后,当你有你的数组(比如说int someArray[]={0,1,2,...,24};),并且你希望它在string1->string2->data下,你可以myMap[string1][string2] = &amp;someArray;

示例: 如果您的myMap 有名为 "ele1""ele2""ele3" 以及 "ele2" 的元素em> 由 ("first",&array1)("second",&array2)("third",&array3) 对组成,为了得到 array3 的内容,并把它们写下来,你会这样做:

for(unsigned int i=0;i<25;i++)
    std::cout << myMap["ele2"]["third"][i];

第二 - 将地图作为一个整体处理

如果您希望能够查看map 的全部内容,您需要定义一个iterator。您可以在 C++ Reference 页面上阅读有关迭代器的信息。在您的情况下,myMap 的迭代器是:

map<string, ReferTimes>::iterator myMapIterator;

对于“内部”地图,它是:

ReferTimes::iterator referTimesIterator;

您可以通过以下方式查看所有数组:

myMapIterator = myMap.begin();
for(;myMapIterator != myMap.end();myMapIterator++){
   cout << myMapIterator->first << endl;
   referTimesIterator = myMapIterator->second.begin();
   for(;referTimesIterator != myMapIterator->second.end(); referTimesIterator++){
      cout << "\t" << referTimesIterator->first << endl << "\t\t";
      for(unsigned int i=0;i<25;i++)
          cout << (*referTimesIterator->second)[i] << " ";
      cout << endl;
   }
}

【讨论】:

  • 嗨,帕维尔,感谢您的回答!好的,这似乎可行,但我需要的有点不同。我现在如何访问这个数组“someArray”来更改单个案例的值?我需要这样做: someArray[i] = someArray[i] + 1 对于给定的一对。示例: bool addStore( string VisPage, string FromPage, int time ){ ... myMap[ VisPage, FromPage ] = &someArray; //我需要改变这种情况: someArray[ time ] = someArray[ time ] + 1; ... } 谢谢!
  • 就像我说的 - 你只需通过 myMap[VisPage][FromPage][time] 访问数组,然后在元素上调用 operator++。它应该工作。所以答案是:myMap[VisPage][FromPage][time]++注意:符号独立于数组类型。所以无论你选择使用vectors还是pointers,都是一样的。
  • 谢谢!它有效!但我需要一点帮助。当我执行 myMap[VisPage][FromPage]=someArray 和 myMap[VisPage][FromPage][time]++ 时,当我第二次调用该方法, myMap[VisPage][FromPage]=someArray 会出错,因为 ++ 将增加第一对的相同数组。如何影响新的“someArray”(仅在必要时)并将现有的用于我已经放入地图中的一对?我错过了条件。它必须像:如果(这对夫妇不存在) -> 使用初始数组; else -> myMap[VisPage][FromPage][time]++ 非常感谢您的支持!!
  • 你需要为每个条目创建一个不同的数组。或者,您可以了解如何使用 new 运算符动态分配内存。然后 - 当您需要一个新数组时,您只需执行int* newArray = new int[25]。如果我的评论真的对您有所帮助-请随时将其标记为答案:)
  • 我刚刚使用这个条件完成了它:if(myMap[ VisPage ][FromPage] == NULL ) 等等,一切正常!!! Thaaaanks !!!:D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-06
  • 2013-07-29
  • 1970-01-01
  • 1970-01-01
  • 2011-05-29
  • 1970-01-01
  • 2021-08-30
相关资源
最近更新 更多