2012-09-27 83 views
3

什麼是最簡單的方法代碼解析字符串輸入這樣的:C++編程競賽讀取輸入

WORD WORD2 
WORD3 WORD4 

WORD5 
WORD6 

即,對字後跟一個空行,接着通過一個未知的號碼的數不詳字每行一個。我想將這些單詞的第一組放入地圖中,並將第二個單詞列表放入一個矢量中。使用getline在第一組配對單詞終止時發現問題。

+0

最好是主觀的。最簡單的代碼?最快的代碼?跑得最快?其他一些指標? –

+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可能對字符串效率更高。