这个文件似乎有点......难以管理。我需要按最高分对文件进行排序,这里是手头文件的一小部分样本:
reece 0
john 5
alex 2
只需几位数据。基本上我需要它按以下排列排序,然后写回原始文件:
john 5
alex 2
reece 0
这也需要无限量的数据(不是inf,但你理解我的意思)。我试过这个:
void read() {
vector<string> arr;
string a, b;
ifstream file1;
file1.open("Scores.txt", ios::out);
int count = 0;
while (file1 >> a >> b) {
string toVec = a + b;
arr.push_back(toVec);
count++;
}
for (int outLoop = 0; outLoop < count; outLoop++) cout << arr[outLoop];
}
现在这从文件中读取并将它们放入向量中但我不知道该从该点做什么。 cout只是表明了这一点:
reece0john5alex2
我如何分拆它并对其进行排序?
答案 0 :(得分:3)
将数据读入分数(int)的多重映射到名称(字符串):
tail
名为std::multimap<int, string> data;
{
std::ifstream fin("Scores.txt");
std::string name;
int score;
while (fin >> name >> score)
data.insert(std::make_pair(score, name));
}
的容器现在保存您的所有数据,按分数编制索引(并按固有升序排序),每个分数有多个名称。
现在使用data
和.rbegin()
向后迭代多地图(向后以降序 - 排序得分),并为每个元素写出名称和分数:
.rend()
如果逐行读取文件,然后单独解析每一行,解析会更加健壮。
如果您知道没有两个人可以获得相同的分数,您可以简化数据存储(虽然不多),方法是将{
std::ofstream fout("Scores.txt");
for (auto it = data.rbegin(), end = data.rend(); it != end; ++it)
fout << data->second << ' ' << data->first << '\n';
}
换成std::multimap
。
此外,如果您的输入非常大,您可能不希望在任何时候将所有数据存储在内存中。这很难但可以避免。如果您发现程序占用的内存太多,您可以考虑研究这个主题。
最后,如果由于某种原因你需要维护每个得分值中的原始名称顺序(即你需要稳定排序),那么你需要更多地考虑这比我有。
我还没有测试过上面的代码片段,所以可能会有拼写错误。而不是复制/粘贴,阅读和理解,然后将想法集成到您自己的代码中。