将字符串解析为整数向量

26

我有一个包含若干个整数的字符串,这些整数用空格分隔。例如:

string myString = "10 15 20 23";

我希望将其转换为整数向量。因此,在该示例中,向量应该相等

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

我该怎么做?对于这个愚蠢的问题,我很抱歉。


1
使用 boost::split_regex - Blacktempel
@juanchopanza,您能否详细解释一下将字符串拆分成整数向量被视为相同的过程? - Disillusioned
@jrok 在仅拆分字符串和同时转换类型的字符串之间存在显着差异。 - Disillusioned
@Shafik_Yaghmour 我明白它们之间有很强的重叠,但那绝对不是一个重复的问题。 - Disillusioned
@Christopher_Creutzig 在所谓的重复问题中没有一个答案返回一个int向量。 - Disillusioned
@Mario_Sannum 如果这个问题有一个真正的副本,那么请标记它。然而,引用一个类似但明显不是副本的问题完全没有帮助。 - Disillusioned
3个回答

37

您可以使用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 );

1
我认为加上包含语句会让这个答案更好。 - Wolf
我是指所有的(+向量)-以及使其编译所必需的[using declarations](http://en.cppreference.com/w/cpp/language/using_declaration)。我会准备好我的(+1) :) - Wolf
顺便说一句:我喜欢这个 while (iss >> number) :-) - Wolf
太好了!(+1d) 另一个选择是 using std::vector; using std::stringstream; using std::string; - Wolf
@mskoryk,那么您可能想要接受此答案 - Wolf
是的,谢谢。这对我来说是新的。 - mskoryk

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

如果向量已经被定义,可以使用以下语句替代最后一行:

myNumbers.assign( std::istream_iterator<int>( is ), std::istream_iterator<int>() );

3
将最后一行代码写为std::vector<int> myNumbers( ( std::istream_iterator<int>( is ) ), std::istream_iterator<int>() );会更加正确,即将第一个参数用圆括号括起来。否则,除了向量定义之外,它还将成为函数声明。 :) - Vlad from Moscow
2
或者您可以使用初始化列表构造函数来解决这个问题。std::vector<int> myNumbers{ std::istream_iterator<int>( is ), std::istream_iterator<int>() }; - Martin York

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, " "));
}

不需要使用 std::copy。因为 std::vector 有一个构造函数,它接受两个迭代器(就像 std::copy 一样)。 - Martin York
2
此外,最好不要在此处包含“好老的for循环”以进行输出,因为它并不容易。 - Wolf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接