代码解析字符串输入的最简单方法是什么,如下所示:
WORD WORD2
WORD3 WORD4
WORD5
WORD6
也就是说,未知数量的单词对后跟一个空白行,然后是未知数量的单词,每行一个。我想将这些单词的第一组放入一个地图中,将第二个单词列表放入一个向量中。
使用getline
在发现第一组配对词何时终止时存在问题。
代码解析字符串输入的最简单方法是什么,如下所示:
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()
map 来检查没有重复的键;在 C++11 中,你应该可以说m.emplace(std::move(x), std::move(y));
. 并且 anunordered_map
使用字符串可能更有效。