gpt4 book ai didi

c++ - 为什么 std::transform 不将 std::string vector 转换为 unsigned int vector ?

转载 作者:搜寻专家 更新时间:2023-10-31 00:56:32 24 4
gpt4 key购买 nike

如标题所述,我正在尝试将 std::string 的 vector 转换为 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() 失败了吗?

最佳答案

Is this because A.begin() fails when A is empty?

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

关于c++ - 为什么 std::transform 不将 std::string vector 转换为 unsigned int vector ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39397317/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com