如何在地图 C++ 中向矢量添加值
How to add values to vector in map C++
我有multimap<string,vector<int>,int> hello
。我正在尝试将 insert
的值设置为 hello
,但出现 No matching member function for call to 'insert'
错误
我认为矢量部分有问题,但我无法弄清楚它到底是什么。
#include <iostream>
#include <sstream>
#include <cstdlib>
#include <string>
#include <vector>
#include <map>
using namespace std;
void addSpace(string &gendata, string &target){
int size = static_cast<int>(gendata.length());
for (int i = 0; i < size; i++){
target += gendata[i];
// check i for (i < gendata.length() - 1) !!!
if (i < gendata.length() - 1 && isdigit(gendata[i]) && isalpha(gendata[i + 1])){
target += ' ';
}
}
}
std::vector<int> make_vector(int a, int b, int c, int d) {
std::vector<int> result;
result.push_back(a);
result.push_back(b);
result.push_back(c);
result.push_back(d);
return result;
}
int main(int argc, const char * argv[]) {
multimap<string,pair<string,int>> student;
multimap<string,vector<int>,int> hello;
multimap<string,pair<string,int>>::iterator itr;
string s, gendata, target, word, name, subject;
int mark=0, i=0;
target = "Aurora Physics 55 Lily Biology 81 Dylan Physics 62 Bella Physics 58 Jaxon Physics 85 Noah Chemistry 98 Jaxon Mathematics 54 Michael Chemistry 98 Charlotte Mathematics 92 Penelope Mathematics 95 Ellie Physics 93";
istringstream iss(target);
int count = 0;
while(iss >> word){
if(count == 0){
name = word;
count++;
}
else if (count == 1){
subject = word;
count++;
}else if (count == 2){
mark = stoi(word);
student.insert({name,{subject,mark}});
count = 0;
}
}
string rememberName;
int bio=0, phys=0, chem=0, maths=0, sum=0;
for (itr = student.begin() ; itr != student.end() ; itr++) {
bio=0; phys=0; chem=0; maths=0;
rememberName = itr->first;
while (rememberName == itr->first) {
if (itr->second.first == "Biology") {
bio = itr->second.second;
}else if(itr->second.first == "Physics"){
phys = itr->second.second;
}else if(itr->second.first == "Chemistry"){
chem = itr->second.second;
}else{
maths = itr->second.second;
}
itr++;
}
itr--;
sum = bio+phys+chem+maths;
// this is where I have a problem
hello.insert({rememberName,{make_vector(bio,phys,chem,maths)},sum});
}
}
我希望它将矢量插入到 hello
地图中。
您对 hello
的声明是错误的。此处不能存在相互关联的三种类型。
查看文档,std::multimap
有 4 个模板参数:
Key
T
(a.k.a。值类型)
Compare
- 将调用 operator()
来比较地图元素的类型。必须是仿函数类型(函数指针,lambda,class 重载 operator()
)。默认为 std::less<Key>
Allocator
- 我们不感兴趣。
当您这样声明 std::multimap
时:
multimap<string,vector<int>,int> hello;
你告诉编译器它应该通过 int
s 来比较键。这没有任何意义 - 在地图中插入或查找元素时,编译器将不得不尝试调用 int(std::string, std::string)
并期望得到类型 bool
的结果,而这是不可能的。
为什么要在此处额外存储 int
?您可以随时根据地图中的 vector
进行计算。恕我直言,最好的解决方案是不要重复自己并使用 std:multimap<std::string, std::vector<int>> hello
如果你真的想存储 sum
和 vector
,你必须以某种方式将它们混合成一种类型。您可以使用 std::pair<std::string, std::pair<std::vector<int>, int>>
,但这会嵌套得很深。例如,您也可以将 push_back
sum 作为向量的最后一个元素,但这使得向量的用途很不明确(那里的一些值代表成绩,其中一个是成绩的总和?)
我有multimap<string,vector<int>,int> hello
。我正在尝试将 insert
的值设置为 hello
,但出现 No matching member function for call to 'insert'
我认为矢量部分有问题,但我无法弄清楚它到底是什么。
#include <iostream>
#include <sstream>
#include <cstdlib>
#include <string>
#include <vector>
#include <map>
using namespace std;
void addSpace(string &gendata, string &target){
int size = static_cast<int>(gendata.length());
for (int i = 0; i < size; i++){
target += gendata[i];
// check i for (i < gendata.length() - 1) !!!
if (i < gendata.length() - 1 && isdigit(gendata[i]) && isalpha(gendata[i + 1])){
target += ' ';
}
}
}
std::vector<int> make_vector(int a, int b, int c, int d) {
std::vector<int> result;
result.push_back(a);
result.push_back(b);
result.push_back(c);
result.push_back(d);
return result;
}
int main(int argc, const char * argv[]) {
multimap<string,pair<string,int>> student;
multimap<string,vector<int>,int> hello;
multimap<string,pair<string,int>>::iterator itr;
string s, gendata, target, word, name, subject;
int mark=0, i=0;
target = "Aurora Physics 55 Lily Biology 81 Dylan Physics 62 Bella Physics 58 Jaxon Physics 85 Noah Chemistry 98 Jaxon Mathematics 54 Michael Chemistry 98 Charlotte Mathematics 92 Penelope Mathematics 95 Ellie Physics 93";
istringstream iss(target);
int count = 0;
while(iss >> word){
if(count == 0){
name = word;
count++;
}
else if (count == 1){
subject = word;
count++;
}else if (count == 2){
mark = stoi(word);
student.insert({name,{subject,mark}});
count = 0;
}
}
string rememberName;
int bio=0, phys=0, chem=0, maths=0, sum=0;
for (itr = student.begin() ; itr != student.end() ; itr++) {
bio=0; phys=0; chem=0; maths=0;
rememberName = itr->first;
while (rememberName == itr->first) {
if (itr->second.first == "Biology") {
bio = itr->second.second;
}else if(itr->second.first == "Physics"){
phys = itr->second.second;
}else if(itr->second.first == "Chemistry"){
chem = itr->second.second;
}else{
maths = itr->second.second;
}
itr++;
}
itr--;
sum = bio+phys+chem+maths;
// this is where I have a problem
hello.insert({rememberName,{make_vector(bio,phys,chem,maths)},sum});
}
}
我希望它将矢量插入到 hello
地图中。
您对 hello
的声明是错误的。此处不能存在相互关联的三种类型。
查看文档,std::multimap
有 4 个模板参数:
Key
T
(a.k.a。值类型)Compare
- 将调用operator()
来比较地图元素的类型。必须是仿函数类型(函数指针,lambda,class 重载operator()
)。默认为std::less<Key>
Allocator
- 我们不感兴趣。
当您这样声明 std::multimap
时:
multimap<string,vector<int>,int> hello;
你告诉编译器它应该通过 int
s 来比较键。这没有任何意义 - 在地图中插入或查找元素时,编译器将不得不尝试调用 int(std::string, std::string)
并期望得到类型 bool
的结果,而这是不可能的。
为什么要在此处额外存储 int
?您可以随时根据地图中的 vector
进行计算。恕我直言,最好的解决方案是不要重复自己并使用 std:multimap<std::string, std::vector<int>> hello
如果你真的想存储 sum
和 vector
,你必须以某种方式将它们混合成一种类型。您可以使用 std::pair<std::string, std::pair<std::vector<int>, int>>
,但这会嵌套得很深。例如,您也可以将 push_back
sum 作为向量的最后一个元素,但这使得向量的用途很不明确(那里的一些值代表成绩,其中一个是成绩的总和?)