如何将一个整数字符串转换为一个包含整数的向量?

4

我知道有关于这个问题的其他问题,然而,我已经使用了那些资源得出我现在拥有的东西,但是我遇到了一个错误,似乎无法解决。同时,请记住我是一个c++初学者。话虽如此,我有一个包含整数的非常大的字符串,格式如下:newString = "12 -34 50 2 -102 13 78 9"(实际字符串要大得多)。然后我尝试使用transform()函数将该字符串转换为int向量:

int convertString(){

    istringstream is(newString);
    vector<int> intVector;
    transform(istream_iterator<string>( is ),
              istream_iterator<string>(),
              back_inserter( intVector ),
              []( const string &newString ){ return ( stoi( newString ) ); } );//This is the line indicated in the error!
    for(int x : intVector )
        cout << x << ' '<<endl;

    return 0;
    }

我遇到的错误是指定的错误行需要一个表达式,有什么办法可以修复这个问题吗?
提前感谢您的帮助,如果有不清楚的地方,请告诉我!

为什么要传递一个只调用 stoi 的 lambda,而不是直接传递 stoi 本身? - Red Alert
@RedAlert:你怎么只传递 stoi?它有两个重载,每个重载都有两个默认参数。 - Steve Jessop
1个回答

7
假设您相当确定输入仅包含格式正确的元素(或只需在遇到不可读取的整数之外停止读取),则这里不需要使用transform - istream_iterator本身完全可以处理转换。您可以直接从迭代器初始化向量,使代码如下:
std::istringstream is(newString);
std::vector<int> intVector { std::istream_iterator<int>(is), 
                             std::istream_iterator<int>()};

在一个方面,这与您的版本不同:如果您将一个无法转换为整数的字符串传递给 stoi,它将抛出一个异常——如果它包含像 ac; 这样无法转换为整数的内容,则会抛出 invalid_argument;如果它包含像50个数字这样的内容,产生的结果超出了目标类型的范围,则会抛出 out_of_range


或者更简单的是,由于模板类型推导,std::vector<int> intVector { std::istream_iterator<int>(is), {} }; - vsoftco
感谢回复!当我尝试这个方法时,错误变成了“在声明末尾预期';'”,这表明出错在stream_iterator<int>(is),这一行。 - user3798269
@user3798269: 可能您正在使用C++11之前的编译器,如果是这样,您需要使用以下代码:std::vector<int> intVector((std::istream_iterator<int>(is)), std::istream_iterator<int>()); - Jerry Coffin
做到了!非常感谢!对于任何遇到相同问题并且好奇我使用的编译器是哪个的人,我猜我应该在问题中包含...我正在使用Qt Creator 3.3。 - user3798269

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