次のような文字列入力を解析する最も簡単な方法は何ですか:
WORD WORD2
WORD3 WORD4
WORD5
WORD6
つまり、不明な数の単語のペアの後に空白行が続き、その後に不明な数の単語が 1 行に 1 つずつ続きます。これらの単語の最初のグループをマップに入れ、単語の 2 番目のリストをベクトルに入れたいと思います。
を使用getline
すると、対になった単語の最初のグループがいつ終了するかを発見するのに問題があります。
次のような文字列入力を解析する最も簡単な方法は何ですか:
WORD WORD2
WORD3 WORD4
WORD5
WORD6
つまり、不明な数の単語のペアの後に空白行が続き、その後に不明な数の単語が 1 行に 1 つずつ続きます。これらの単語の最初のグループをマップに入れ、単語の 2 番目のリストをベクトルに入れたいと思います。
を使用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 */ }
同様に、必要に応じて、ファイルの 2 番目の部分に空白が含まれていないことを確認するチェックを追加できます。最後に、insert()
for map を使用して、重複するキーがないことを確認できます。C++11 では、 と言えるはずですm.emplace(std::move(x), std::move(y));
。そして、unordered_map
文字列を使用すると、おそらくはるかに効率的です。