【问题标题】:C++, How to use maps for holding multiple integer valuesC++,如何使用映射来保存多个整数值
【发布时间】:2015-09-09 23:56:54
【问题描述】:

我正在为一个 C++ 项目开发一个单词标记系统。我需要一个地图存储以下键值信息的系统:

word["with"] = 16, 6, 15;

其中 ["with"] 是索引,三元组 (16, 6, 15) 是索引的值。我已经尝试过地图,但我不断收到语义错误,我理解这是由于无法提供超过 1 个值的键。

我尝试了多张地图,但我似乎无法获得满足我需要的语法?

我想避免使用结构或类,因为这个数据库已经包含 200 个单词,我正在努力保持我的代码行可读性和最小化。

我该怎么做呢?我错过了什么吗?您将如何声明这样的系统?

【问题讨论】:

  • std::multi_map 或 std::unordered_map 应该适合你,你能分享你的代码吗?
  • 地图 >

标签: c++ maps key-value


【解决方案1】:

您应该将您的地图声明为std::map<std::string, std::vector<unsigned int>>,这样您就可以为您的索引提供一个值向量。

【讨论】:

  • @AdamShort 我想解释一下 something 因为“带评论”删除的原因都不适合...
  • @o11c 一个简短的(甚至是次等的)答案不是删除它的好理由,除非已经有 10 多个答案。更短甚至不是投反对票的好理由,更不用说删除了!简洁真棒。
【解决方案2】:

您可以制作一个映射,将Strings 映射到Vectors 或其他可以容纳任意数量整数的数据结构。

然而,值得注意的是,结构和类之类的东西是用于组织代码的语言的组件。构造组相关数据;类对相关数据组及其相关行为进行建模。没有它们当然可以做任何事情,但这会产生一些非常不可读的代码。

行数以及是否使用类/结构是衡量代码复杂性和可读性的较差指标。而且它们提供的模块化远远超过了取消引用这些值的分钟运行时间成本。

【讨论】:

  • 谢谢,非常有用。我应该补充一点,该程序已经有 500 行了,我预计在本周末之前它会达到 1,500 行。我为系统设计的当前网络方法 HIVE 依赖于确保程序尽可能小并尽可能快地运行。但是谢谢你的回答,我肯定会重新考虑结构。我不怕 Classes 和 Structs,我已经在程序中使用它们了。
  • @AdamShort 不要将小与快混淆。有时越大越好,如果您正在开发一个系统而不是对其进行性能调整,请从简单开始。在简单和快速交叉的地方,使用快速,但是当快速是混乱的混乱时,使用简单,直到证明你需要额外的速度。更容易调试意味着在调整系统时错误更少。
  • @user4581301 谢谢,这是一些很好的建议,这是我第一次用 C++ 编程,也是我第一次处理这么大的项目,所以谢谢你的有用建议。我会记住这一点!
【解决方案3】:

word["with"] = 16, 6, 15;//这个用法不对

std::multimapstd::unordered_multimap 应该适合你。

如果你定义单词如下:

std::multimap<std::string,int> word;

您应该如下所示插入值到映射:

std::string key="with";

word.insert(std::pair<std::string,int>(key,16));
word.insert(std::pair<std::string,int>(key,6));
word.insert(std::pair<std::string,int>(key,15));


for( auto &x : word)
  std::cout<<x.first<<" " << x.second<<"\n";    

正如 user4581301 在评论中指出的,如果您启用了 C++11 编译器,您可以将值插入到 std::multimap 中,如下所示:

    word.emplace("with",16);
    word.emplace("with",6);
    word.emplace("with",15);

演示:http://coliru.stacked-crooked.com/a/c7ede5c497172c5d

【讨论】:

  • 是的,但我需要 3 个值,而不是一个。
  • @AdamShort 现在有 3 个键为“with”的值
【解决方案4】:

使用 C++ 映射来保存多个整数值的示例:

#include<iostream>
#include<map>
#include<vector>
using namespace std;
int main(){
    std::map<int, std::vector<int> > mymap2;
    std::vector<int> myvector;
    myvector.push_back(8);
    myvector.push_back(11);
    myvector.push_back(53);
    mymap2[5] = myvector;
    cout << mymap2[5][0] << endl;
    cout << mymap2[5][1] << endl;
    cout << mymap2[5][2] << endl;
}

打印:

8
11
53

只需将 int 数据类型替换为字符串,您就应该能够将字符串映射到数字列表。

【讨论】:

    猜你喜欢
    • 2013-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-07
    • 1970-01-01
    相关资源
    最近更新 更多