我有以下数据作为输入(按第一列排序):
foo 1 2
foo 3 3
bar 10 11
我想创建一个Vector of Map,第一列作为地图的关键 这样我们就有了:
foo = {1,2,3,3}
bar = {10,11}
但为什么我的代码不能按预期工作?
#include <vector>
#include <map>
#include <iostream>
#include <fstream>
#include <sstream>
using namespace std;
int main ( int arg_count, char *arg_vec[] ) {
if (arg_count !=2 ) {
cerr << "expected one argument" << endl;
return EXIT_FAILURE;
}
string line;
ifstream acemblyfile (arg_vec[1]);
map <string, vector<int> > myMapOfVec;
vector <string> myVec;
string KEY = "" ;
if (acemblyfile.is_open())
{
while (getline(acemblyfile,line) )
{
stringstream ss(line);
string KEY_TEMP;
int VAL1;
int VAL2;
ss >> KEY_TEMP >> VAL1 >> VAL2;
MyVec.push_back(VAL1);
MyVec.push_back(VAL2);
if (KEY_TEMP != KEY) {
myMapOfVec[KEY] = MyVec;
KEY = KEY_TEMP;
MyVec.clear();
}
}
acemblyfile.close();
}
else {
cout << "Unable to open file";
}
for( map<string, vector<int> >::iterator iter = myMapOfVec.begin(); iter != myMapOfVec.end(); ++iter ) {
vector <int> tempVec = (*iter).second;
string Key = (*iter).first;
for (unsigned i =0; i<tempVec.size(); i++) {
cout << Key << " " << tempVec[i] << endl;
}
}
return 0;
}
答案 0 :(得分:16)
正如Mykola所说,你应该在地图中使用矢量而不是自己创建矢量。我改变了你的整个代码,这对我有用。请注意,您编写了一些带有错误大小写的变量名称(MyMapOfVec而不是myMapOfVec),这导致了编译器错误。
另外请确保输入文件末尾没有换行符,因为这会导致重复最后一行。
#include <vector>
#include <map>
#include <iostream>
#include <fstream>
#include <sstream>
using namespace std;
int main ( int arg_count, char *arg_vec[] ) {
if (arg_count !=2 ) {
cerr << "expected one argument" << endl;
return EXIT_FAILURE;
}
string line;
ifstream acemblyfile (arg_vec[1]);
map <string, vector<int> > myMapOfVec;
string KEY;
if (acemblyfile.is_open())
{
while (getline(acemblyfile, line) )
{
stringstream ss(line);
int VAL1;
int VAL2;
ss >> KEY >> VAL1 >> VAL2;
myMapOfVec[KEY].push_back(VAL1);
myMapOfVec[KEY].push_back(VAL2);
}
acemblyfile.close();
}
else {
cout << "Unable to open file";
}
for( map<string, vector<int> >::iterator iter = myMapOfVec.begin(); iter != myMapOfVec.end(); ++iter ) {
vector<int> tempVec = (*iter).second;
string Key = (*iter).first;
cout << Key;
for (unsigned i = 0; i < tempVec.size(); i++) {
cout << " " << tempVec[i];
}
cout << endl;
}
return 0;
}
对于您的示例,这将提供输出
bar 10 11
foo 1 2 3 3
答案 1 :(得分:1)
不要添加对KEY_TEMP!= KEY的检查。因为在你的情况下他们是相同的,因为foo一个接一个地去两次。只是
myMapOfVec[KEY].push_back( VAL1 );
myMapOfVec[KEY].push_back( VAL2 );
答案 2 :(得分:-2)
关于地图和矢量的一些基础知识 - http://rowsandcolumns.blogspot.com/2010/10/c-maps-and-vectors.html