std :: transform on temporary object

时间:2015-10-23 17:28:53

标签: c++ lambda

我有一个返回对象向量的函数,我想创建一个从这些对象中取出的成员向量。我正在使用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();});

}

2 个答案:

答案 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_inserterpush_back向量中的元素。

std::transform(elements.begin(), elements.end(), std::back_inserter(ids),
               [](const Container *container){ return container->id();});