2015-09-21 61 views
0

如何拆分std :: string以便結構對象的值被填充。如何從boost :: split獲取多個參數

q.Qcmd = "Command1" 
q.timeValue = 1.0 

這是示例代碼。

struct QueueCommand 
{ 
std::vector<std::string>QCmd; 
std::vector<float>timeValue; 
}; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
std::string str = "command1|1.0" 
std::string str1 = "command2|2.0" 
QueueCommand q; 
boost::split(q,str,boost::is_any_of("|")); // need to fill Qcmd and timevalue 
boost::split(q,str1,boost::is_any_of("|")); 
return 0; 
} 

回答

2

這不是boost::split的正確用法,因爲第一個參數是一個容器string,並且split不知道如何填寫的具體結構。我給你提示如何解決它。我沒有測試的代碼,但你可以嘗試自己:

首先,你必須聲明一個載體來存儲部分:

std::vector<std::string> parts; 

然後,boost::split可以分割的命令字符串:

boost::split(parts, str, boost::is_any_of("|")); 

預訂在相應QueueCommand可變足夠的空間:

q.QCmd.resize(parts.size() - 1); 

(最後一個包含浮點數)。將字符串複製到結構中。你必須確保所有器件陣列至少包含兩個元素:

std::copy(parts.begin(), parts.begin() + parts.size() - 1, q.QCmd.begin()); 

設置結構的浮體部:

q.timeValue = boost::lexical_cast<float>(parts[parts.size() - 1]); 

5gon12eder建議在評論

這似乎更優雅和高效,但需要C++ 11 for std::move

q.timeValue = boost::lexical_cast<float>(parts.back()); 
parts.pop_back(); 
q.QCmd = std::move(parts); 
+2

我會先*做'q.timeValue = boost :: lexical_cast (parts.back());',然後'parts.pop_back();'然後'q.QCmd = std :: move(部分)'。看起來既簡單又高效。如果你想壓縮最後一個字節,在'pop_back()'之後做'shrink_to_fit()'。 (我假設你的'reserve()'是爲了'resize()',否則該向量的大小可能是錯誤的/行爲未定義。) – 5gon12eder

+0

啊,你是對的。非常好的建議。我正在更改'reserve',但如果您想添加其他答案,我會留下您的代碼。 –

+0

我很高興你喜歡它;如果您覺得合適,請隨時採用。我不打算自己發佈答案。 – 5gon12eder