C++,如何使用映射来保存多个整数值
C++, How to use maps for holding multiple integer values
我正在为一个 C++ 项目开发一个单词标记系统。我需要一个地图存储以下键值信息的系统:
word["with"] = 16, 6, 15;
其中["with"]是索引,三元组(16,6,15)是索引的值。我试过地图,但我不断收到语义错误,据我所知,这是由于无法为键提供超过 1 个值的结果。
我尝试了多个地图,但我似乎无法获得满足我需要的语法?
我想避免使用 Structs 或 类,因为这个数据库已经包含 200 个单词,并且我正在努力保持我的代码行可读性并且太少。
我该怎么做?我错过了什么吗?您将如何声明这样的系统?
您可以创建一个映射,将 Strings
映射到 Vectors
或其他可以容纳任意数量整数的数据结构。
然而,值得注意的是,诸如 Structs 和 类 之类的东西是旨在组织代码的语言的组件。构造组相关数据; 类 对相关数据组及其相关行为进行建模。没有它们当然可以做所有事情,但这会导致一些非常难以阅读的代码。
行数和是否使用 classes/structs 是衡量代码复杂性和可读性的不良指标。而且它们提供的模块化远远超过取消引用这些值的分钟运行成本。
您应该将您的地图声明为 std::map<std::string, std::vector<unsigned int>>
,这样您的索引就可以有一个值向量。
word["with"] = 16, 6, 15;
//这个用法是错误的
std::multimap
或 std::unordered_multimap
应该适合你。
如果你定义word如下:
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);
使用 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 数据类型替换为字符串,您就应该能够将字符串映射到数字列表。
我正在为一个 C++ 项目开发一个单词标记系统。我需要一个地图存储以下键值信息的系统:
word["with"] = 16, 6, 15;
其中["with"]是索引,三元组(16,6,15)是索引的值。我试过地图,但我不断收到语义错误,据我所知,这是由于无法为键提供超过 1 个值的结果。
我尝试了多个地图,但我似乎无法获得满足我需要的语法?
我想避免使用 Structs 或 类,因为这个数据库已经包含 200 个单词,并且我正在努力保持我的代码行可读性并且太少。
我该怎么做?我错过了什么吗?您将如何声明这样的系统?
您可以创建一个映射,将 Strings
映射到 Vectors
或其他可以容纳任意数量整数的数据结构。
然而,值得注意的是,诸如 Structs 和 类 之类的东西是旨在组织代码的语言的组件。构造组相关数据; 类 对相关数据组及其相关行为进行建模。没有它们当然可以做所有事情,但这会导致一些非常难以阅读的代码。
行数和是否使用 classes/structs 是衡量代码复杂性和可读性的不良指标。而且它们提供的模块化远远超过取消引用这些值的分钟运行成本。
您应该将您的地图声明为 std::map<std::string, std::vector<unsigned int>>
,这样您的索引就可以有一个值向量。
word["with"] = 16, 6, 15;
//这个用法是错误的
std::multimap
或 std::unordered_multimap
应该适合你。
如果你定义word如下:
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);
使用 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 数据类型替换为字符串,您就应该能够将字符串映射到数字列表。