【问题标题】:Why doesn't std::transform convert the std::string vector to unsigned int vector?为什么 std::transform 不将 std::string 向量转换为无符号整数向量?
【发布时间】:2017-01-16 18:18:45
【问题描述】:

如标题中所述,我正在尝试将std::string 的向量转换为unsigned int。但是我遇到了分段错误。这是我的代码:

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

int main() {
    unsigned int N = 3;
    std::string array_string = "2 5 8";
    std::vector<unsigned int> A;

    std::istringstream array_stream(array_string);

    std::vector<std::string> array {
        std::istream_iterator<std::string>{array_stream},
        std::istream_iterator<std::string>{}
    };
    A.clear(); A.reserve(N);
    std::transform(array.begin(), array.end(), A.begin(), [] (const std::string& str) {
        return std::stoi(str);
    });
    for(std::vector<unsigned int>::iterator it = A.begin(); it != A.end(); it++) {
        std::cout << *it << " ";
    }
    std::cout << std::endl;
    std::cout << A.size() << std::endl;
    return 0;
}

OTOH,在对std::transform 的调用中将A.begin() 更改为std::back_inserter(A) 有效。这是因为A 为空时A.begin() 失败吗?

【问题讨论】:

    标签: c++ vector stl c++14


    【解决方案1】:

    这是因为A 为空时A.begin() 失败吗?

    是的,这就是原因。您对reserve 的调用不会改变A 是空的事实,之后它仍然是空的。调用reserve 只会改变容量,即后续插入不会分配任何内存。

    如果你想使用A.begin(),你必须调用resize,因为这实际上会改变A的大小:

    A.resize(N); //Resize array
    std::transform(array.begin(), array.end(), A.begin(), [] (const std::string& str) {
        return std::stoi(str);
    });
    

    【讨论】:

    • 在调用resize 之后A 会发生什么?
    • @Priyatham 在resize A 之后有:capacity &gt;= Nsize == N。新元素是默认构造的
    • 那么,在这种情况下,它们是零?谢谢!
    • 另一种选择:不要做任何resizestd::transform(array.begin(), array.end(), std::back_inserter(A), []...)
    • 糟糕,是的,错过了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-08
    • 1970-01-01
    • 2013-02-07
    • 2016-03-01
    • 2012-09-19
    相关资源
    最近更新 更多