2013-12-18 59 views
9

的矢量我有一個包含被分隔的空間整數的一些數字的字符串。例如解析字符串INT

string myString = "10 15 20 23"; 

我想將其轉換爲整數向量。所以在這個例子中,矢量應該是平等的

vector<int> myNumbers = {10, 15, 20, 23}; 

我該怎麼辦?對不起,愚蠢的問題。

+0

使用'提振:: split_regex' – Blacktempel

+0

@juanchopanza你能親切地講解如何分裂成**串* *被認爲是相同的分裂成一個***向量int ***? –

+0

@jrok僅僅在分割字符串和拆分字符串的同時轉換類型之間存在顯着差異。 –

回答

17

您可以使用std::stringstream。除了其他包含之外,您需要#include <sstream>

#include <sstream> 
#include <vector> 
#include <string> 

std::string myString = "10 15 20 23"; 
std::stringstream iss(myString); 

int number; 
std::vector<int> myNumbers; 
while (iss >> number) 
    myNumbers.push_back(number); 
+0

我想加入include語句會使這個答案更好。 – Wolf

+0

@Wolf謝謝你指出。添加。 –

+0

我的意思是所有(+載體) - 並且還[using聲明](http://en.cppreference.com/w/cpp/language/using_declaration)必要使其編譯。我會繼續我的(+1)準備:) – Wolf

0

這幾乎是現在其他答案的重複。

#include <iostream> 
#include <vector> 
#include <iterator> 
#include <sstream> 

int main(int argc, char* argv[]) { 
    std::string s = "1 2 3 4 5"; 
    std::istringstream iss(s); 
    std::vector<int> v{std::istream_iterator<int>(iss), 
         std::istream_iterator<int>()}; 
    std::copy(v.begin(), v.end(), std::ostream_iterator<int>(std::cout, " ")); 
} 
+0

不需要使用'std :: copy'。因爲'std :: vector'有一個需要兩個迭代器的構造函數(就像std :: copy一樣)。 –

+1

另外* *舊的for循環*的輸出應該不包括在這裏,因爲它*不容易*。 – Wolf

5
std::string myString = "10 15 20 23"; 
std::istringstream is(myString); 
std::vector<int> myNumbers(std::istream_iterator<int>(is), std::istream_iterator<int>()); 

如果向量已經然後被定義或代替最後一行

+2

這將是更正確地寫入的最後一行如std ::矢量通過myNumbers((標準:: istream_iterator (是)),的std :: istream_iterator ());即將第一個參數括在括號內。否則,而不是向量定義它將是一個函數聲明。:) –

+2

或者你可以使用初始化列表構造,旨在解決這個問題。 '的std ::矢量通過myNumbers {的std :: istream_iterator (是),性病:: istream_iterator ()};' –