为什么 std::transform 不将 std::string 向量转换为无符号的 int 向量?

Why doesn't std::transform convert the std::string vector to unsigned int vector?

本文关键字:向量 std 无符号 int 转换 transform 不将 string 为什么      更新时间:2023-10-16

如标题所述,我试图将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.begin()失败时,A是空的?

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

是的,这就是原因。你对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);
});