我不确定如何正确地将数据输入地图

时间:2015-03-06 01:33:33

标签: c++

以下是我的代码,我正在从文件中读取数据,并且一次将数据一行并尝试将其插入到地图中。我不允许使用多个地图。

using namespace std;

int main( int argc, char* argv[]){

    char* file = argv[1];          // saves name of file
    ifstream infile ( file );      // Imported file
    map <string,  set < pair < string, string  > > > m;
    string data;
    string key;
    string year;
    string count;

    if(!infile){
        cout << "Error opening file" << endl;
        return -1;
    }

    while (!infile.eof() ){
        getline(infile, data);

        for ( unsigned int i = 0; i < data.length(); i++ ){
            while ( data[i] != '\t'){
                key += data[i];
                i++;
            }
            i++;
            while ( data[i] != '\t'){
                year += data[i];
                i++;
            }
            i++;
            while ( data[i] != '\t'){
                count += data[i];
                i++;
            }
            cout << key << endl;
            cout << year << endl;
            cout << count << endl;
            cout << endl;
            break;
        }

        m.insert(key, set < pair < string, string > > ( year, count)  );
        key.clear();
        year.clear();
        count.clear();
    }

}

2 个答案:

答案 0 :(得分:0)

您在这里定义一个带有键的值和一组对的值:

map <string,  set < pair < string, string  > > > m;

这真的是你想要的吗?

如果要将一对字符串与一个键相关联,请将您的地图简单地定义为:

map <string,  pair < string, string  >  > m;

要插入新值,您可以执行以下操作:

m[key] = make_pair (year, count); 

如果在另一方面,您希望将几个不同的对关联到同一个关键字,那么您可以使用 multimap

P.S。:它与您的问题没有直接关系,但从不在C ++中使用eof。请改用while (getline(infile, data) )

答案 1 :(得分:0)

问题是您是在地图中插入,但是要插入地图中键中的集合

尝试更改

 m.insert(key, set < pair < string, string > > ( year, count)  );

使用:

m[key].insert(make_pair(year, count));

或(更强大):

map <string,  set < pair < string, string  > > >::iterator it = m.find(key)
if (key == m.end) {
    set <pair<string,string>> s;
    s.insert(make_pair(year, count));
    m.insert(make_pair(key, s));
} else {
    it->second.insert(make_pair(year, count));
}