首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于编程竞赛的C++读取输入

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

Stack Overflow用户
提问于 2012-09-28 04:04:32
回答 1查看 1.6K关注 0票数 3

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

代码语言:javascript
复制
WORD WORD2
WORD3 WORD4

WORD5
WORD6

也就是说,未知数量的单词对,后跟一个空行,然后是未知数量的单词,每行一行。我想把这些单词的第一组放到映射中,把第二组单词放到向量中。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-09-28 04:14:49

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

代码语言:javascript
复制
#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";

如果您希望确保文件的第一部分完全由单词对组成,中间只有一个空格区域,则可以将条件强化为:

代码语言:javascript
复制
if (!(iss >> x >> y >> std::ws) || iss.get() != EOF) { /* fatal error */ }

同样,如果您愿意,您可以添加一个检查,以确保文件的第二部分不包含空格。最后,您可以对映射使用insert()来检查是否有重复的键;在C++11中,您应该能够输入m.emplace(std::move(x), std::move(y));。而且unordered_map处理字符串的效率可能要高得多。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12629218

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档