用于编程竞赛的C ++读取输入

时间:2012-09-27 20:04:32

标签: c++

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

WORD WORD2
WORD3 WORD4

WORD5
WORD6

也就是说,未知数量的单词对后跟一个空白行,后跟一行未知数量的单词。我想将第一组这些单词放入一个地图中,将第二组单词放入一个向量中。

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

1 个答案:

答案 0 :(得分:6)

使用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可能效率更高。