我有一个返回对象向量的函数,我想创建一个从这些对象中取出的成员向量。我正在使用std :: transform来做到这一点。但是,代码是segfualts。 GDB并不是很有帮助。谁能解释一下发生了什么?
#include <algorithm>
#include <iostream>
using namespace std;
class Container
{
private:
string _id;
public:
Container(const string &str): _id(str) {}
const decltype(_id) &id() const {
return this->_id;
}
};
Container a{"hello"}, b{"world"};
vector<Container *> fn()
{
return {&a,&b};
}
int main() {
vector<string> ids;
const auto &elements = fn();
std::transform(elements.begin(), elements.end(), ids.begin(), [](const Container *container){ return container->id();});
}
答案 0 :(得分:2)
ids.begin()
不是长度为elements.size()
的有效范围的迭代器,因为ids
为空且elements
的大小为2。
您可能需要std::back_inserter(ids)
代替:
std::vector<std::string> ids;
std::transform(elements.begin(), elements.end(),
std::back_inserter(ids),
[](const Container *container){ return container->id();});
assert(ids.size() == elements.size());
答案 1 :(得分:2)
vector<string> ids;
是一个空向量,您正在尝试使用普通迭代器向其中添加元素。这将导致段错误,因为您将访问您不拥有的内存。您需要的是back_inserter
到push_back
向量中的元素。
std::transform(elements.begin(), elements.end(), std::back_inserter(ids),
[](const Container *container){ return container->id();});