2013-12-18 54 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 ()};' –