gpt4 book ai didi

c++ - MultiMap 读入数据有问题?

转载 作者:行者123 更新时间:2023-11-28 00:57:23 24 4
gpt4 key购买 nike

所以这样做的目的是读入一个包含数字和名称的文本文件,如下所示:

50 Leonardo
20 Donatello
100 Rapheal
40 Michelagelo

我正要打印出来检查它是否正确。我没有像预期的那样获得文本文件的拷贝,而是为所有名称重复了姓氏。

这是我得到的:

Michelagelo 50
Michelagelo 20
Michelagelo 100
Michelagelo 100

代码:

ifstream top;   
char output[100];
char* defaultName = "Default";
int tempTop;
char* tempName;


top.open("top.txt");
top.clear();
top.seekg( 0, std::ios_base::beg );


typedef multimap <char*, int> MM;
MM top;

if (top.is_open()) {
while (!top.eof()){

//Get Score
top>>output;
tempTop=atoi(output);


//Get Name
top>>output;
tempName=output;

cout << "Writing: " << tempName << " and " << tempTop << endl;
top.insert(MM::value_type(tempName,tempTop));

}
}

MM::iterator i;

for(i=top.begin(); i!=top.end(); i++){
cout << (*i).first << " " << (*i).second << endl;
}
cout << "Size is: " << top.size() << endl;

我的另一个问题是,我正在使用这个多重映射,因为我被引导相信它会产生一个排序列表?

非常困惑,我很感激向我展示我的新手方式的错误。

TIA

最佳答案

您的问题主要源于尝试直接使用 char *,而不是像您应该的那样使用 std::string。如果您坚持使用 char*,则需要动态分配您使用的每个字符串,并提供一个比较器对象来比较字符串的内容而不是指针。

底线:除非别无选择,否则请使用 std::string。如果您真的不能使用std::string,您几乎肯定想编写一个您自己的类来提供至少大致相似的功能(尽管可能没有太多搜索、替换等)

完成后,您将遇到另一个小问题:while (!top.eof()) 几乎肯定会导致问题(通常看起来像读文件的最后一行两次)。您几乎肯定希望根据尝试读取的结果读取循环的值和基础延续。

while (top >> number >> name)
MM.insert(MM::value_type(number, name));

编辑:如果我这样做,我可能会稍微不同地实现它,以避免编写显式循环。我将从以下内容开始:

typedef std::pair<std::string, int> v_t;

std::istream &operator>>(std::itream &is, v_t &v) {
is >> v.second;
std::getline(is, v.first);
return is;
}

那应该从输入文件的一行中读取数据。然后你可以使用 istream_iterator 来填充你的 multimap:

std::ifstream top("top.txt");

// define multimap, initialized from stream:
std::multimap<std::string, int> MM((std::istream_iterator<v_t>(top)),
std::istream_iterator<v_t>());

关于c++ - MultiMap 读入数据有问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10386990/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com