C++编程竞赛的阅读输入

C++ reading input for programming contests

本文关键字:输入 编程 竞赛 C++      更新时间:2023-10-16

代码解析字符串输入的最简单方法是什么,如下所示:

WORD WORD2
WORD3 WORD4
WORD5
WORD6
也就是说,未知数量的单词对后跟一个空行,

后跟未知数量的单词,每行一个。 我想把第一组单词放到一个地图中,把第二组词放到一个向量中。

使用 getline 在发现第一组配对单词何时终止时存在问题。

使用getline和一些容器的简单问题:

#include <string>
#include <sstream>
#include <iostream>
#include <vector>
#include <map>
std::map<std::string, std::string> m;
std::vector<std::string>           v;
for (std::string line; std::getline(std::cin, line); )
{
    if (line.empty()) { break; }
    std::string x, y;
    std::istringstream iss(line);
    if (!(iss >> x >> y >> std::ws)) { /* fatal error */ }
    m[x] = y;
}   
for (std::string line; std::getline(std::cin, line); )
{
    v.push_back(std::move(line));
}
std::cout << "We read " << m.size() << " pairs and " << v.size() << " words.n";

如果要确保文件的第一部分精确地由单词对组成,中间有一个空格区域,则可以将条件增强为:

if (!(iss >> x >> y >> std::ws) || iss.get() != EOF) { /* fatal error */ }

同样,如果您愿意,可以添加检查文件的第二部分不包含空格。最后,您可以使用映射的insert()来检查是否有重复的键;在 C++11 中,您应该能够说m.emplace(std::move(x), std::move(y));.使用字符串时,unordered_map可能更有效。