具有 2 个值的 STL 映射
STL map with 2 values
我正在编写一个程序来读取电影及其评级的文本文件
movies.txt
7
Happy Feet
4
Happy Feet
5
Pirates of the Caribbean
3
Happy Feet
4
Pirates of the Caribbean
4
Flags of our Fathers
5
Gigli
1
第一个值 (7) 用于 for 循环,这是一个赋值,所以我无法更改任何内容。
我的任务是用一张地图或多张地图来存储电影、评论次数(一部电影被评论了多少次,例如 Happy Feet 为 3 次)和平均评论分数。
我怀疑我可以使用 multimap 来完成此操作,但我找不到类似的示例,所以我开始使用嵌套地图来完成它。
#include <iostream>
#include <fstream>
#include <string>
#include <algorithm>
#include <cctype>
#include <map>
using std::cout;
using std::endl;
using std::isspace;
using std::getline;
using std::string;
using std::ifstream;
using std::map;
#include "Map.h"
int main(){
ifstream inStream;
int number, rating;
string name;
map<int, int> movieMap;
map<string, map<int, int>> reviewMap;
inStream.open("movies.txt");
inStream >> number;
inStream.ignore();
for (int count = 0; count < number; count++){
getline(inStream, name);
inStream >> rating;
inStream.ignore();
++reviewMap[name][rating];
}
std::map<int, int>::iterator itr1;
std::map<string, map<int, int>>::iterator itr2;
for (itr2 = reviewMap.begin(); itr2 != reviewMap.end(); itr2++)
{
std::cout << "\n " << itr2->first << endl;
for (itr1 = itr2->second.begin(); itr1 != itr2->second.end(); itr1++)
{
std::cout << "\n" << itr1->first << endl;
}
}
system("pause");
return(0);
所以目前我的代码存储了我想要的电影名称,但它存储了我的评论计数和我的评论分数作为单独的值。
例如,当我 cout itr1->second
为 Happy Feet 我得到 2 个值,2 和 1,我想要 1 个值 3,并且评论分数存储为单独的值,但只有当它们是唯一的时, 所以 Happy Feet 存储了 2 个值,4 和 5,其中我想要 1 个值 13(这个值最终必须是平均值,我会在到达它时穿过那座桥)。
我不是在寻找完整的解决方案,只是寻找正确方向的指针。
一张简单的地图就可以满足您的需要。
从数据结构开始:
struct Rating
{
int number;
int totalRating;
};
map<string, Rating> reviewMap;
然后您只需要保持 运行 总数。由此,您可以计算出平均评分。
我正在编写一个程序来读取电影及其评级的文本文件
movies.txt
7
Happy Feet
4
Happy Feet
5
Pirates of the Caribbean
3
Happy Feet
4
Pirates of the Caribbean
4
Flags of our Fathers
5
Gigli
1
第一个值 (7) 用于 for 循环,这是一个赋值,所以我无法更改任何内容。
我的任务是用一张地图或多张地图来存储电影、评论次数(一部电影被评论了多少次,例如 Happy Feet 为 3 次)和平均评论分数。 我怀疑我可以使用 multimap 来完成此操作,但我找不到类似的示例,所以我开始使用嵌套地图来完成它。
#include <iostream>
#include <fstream>
#include <string>
#include <algorithm>
#include <cctype>
#include <map>
using std::cout;
using std::endl;
using std::isspace;
using std::getline;
using std::string;
using std::ifstream;
using std::map;
#include "Map.h"
int main(){
ifstream inStream;
int number, rating;
string name;
map<int, int> movieMap;
map<string, map<int, int>> reviewMap;
inStream.open("movies.txt");
inStream >> number;
inStream.ignore();
for (int count = 0; count < number; count++){
getline(inStream, name);
inStream >> rating;
inStream.ignore();
++reviewMap[name][rating];
}
std::map<int, int>::iterator itr1;
std::map<string, map<int, int>>::iterator itr2;
for (itr2 = reviewMap.begin(); itr2 != reviewMap.end(); itr2++)
{
std::cout << "\n " << itr2->first << endl;
for (itr1 = itr2->second.begin(); itr1 != itr2->second.end(); itr1++)
{
std::cout << "\n" << itr1->first << endl;
}
}
system("pause");
return(0);
所以目前我的代码存储了我想要的电影名称,但它存储了我的评论计数和我的评论分数作为单独的值。
例如,当我 cout itr1->second
为 Happy Feet 我得到 2 个值,2 和 1,我想要 1 个值 3,并且评论分数存储为单独的值,但只有当它们是唯一的时, 所以 Happy Feet 存储了 2 个值,4 和 5,其中我想要 1 个值 13(这个值最终必须是平均值,我会在到达它时穿过那座桥)。
我不是在寻找完整的解决方案,只是寻找正确方向的指针。
一张简单的地图就可以满足您的需要。
从数据结构开始:
struct Rating
{
int number;
int totalRating;
};
map<string, Rating> reviewMap;
然后您只需要保持 运行 总数。由此,您可以计算出平均评分。