如标题中所述,我正在尝试将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,在调用A.begin()
时将std::back_inserter(A)
更改为std::transform
。这是因为A.begin()
在A
为空时失败了吗?
答案 0 :(得分:4)
这是因为当
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);
});