C++ C++;11使用共享ptr转换为向量和类

C++ C++;11使用共享ptr转换为向量和类,c++,c++11,lambda,transform,shared-ptr,C++,C++11,Lambda,Transform,Shared Ptr,我正在尝试将转换应用于共享\u ptr并存储到共享\u ptr,同时在类中使用函数 我创建了这个示例: #include <vector> #include <iostream> #include <memory> #include <algorithm> using namespace std; class MyClass { public: int factor = 0; MyClass(const int factor_)

我正在尝试将转换应用于
共享\u ptr
并存储到
共享\u ptr
,同时在类中使用函数

我创建了这个示例:

#include <vector>
#include <iostream>
#include <memory>
#include <algorithm>

using namespace std;

class MyClass {
public:
    int factor = 0;
    MyClass(const int factor_) : factor(factor_) {}

    shared_ptr<vector<int> > mult(shared_ptr<vector<int> > numbers) {
        shared_ptr<vector<int> > result(new vector<int>() );

        transform(numbers->begin(), numbers->end(), result->begin(),
            [this](int x){ return factor * x; });

        return result;
    }
};

int main()
{
    shared_ptr<vector<int> > numbers(new vector<int>());
    shared_ptr<vector<int> > res(new vector<int>());
    MyClass times_two(2);

    numbers->push_back(1);
    numbers->push_back(2);
    numbers->push_back(3);

    res = times_two.mult(numbers);

    cout << "{";
    for (unsigned int i = 0; i < res->size(); ++i)
        cout << res->at(i) << ", ";
    cout << "}";    

    return 0;
}

由于
result
为空,
result->begin()
返回结束迭代器值
std::transform
复制输入序列,应用转换lambda,并将转换结果写入输出迭代器

因为向量是空的,所以没有要写入的内容。您正在运行空数组的末尾,导致未定义的行为和内存损坏

在这种情况下,只需预先分配输出数组,因为您事先知道其大小:

shared_ptr<vector<int> > result(new vector<int>(numbers->size()) );
shared_ptr结果(新向量(数字->大小());
现在,这将创建正确大小的输出数组,
begin()
将在数组开头返回一个迭代器,
std::transform()
将愉快地在数组上涂鸦


如果您确实希望避免初始化新数组时的额外开销,只是为了覆盖它,您可以使用
reserve()
预先分配数组的最终大小,然后使用
std::back\u insert\u迭代器作为输出迭代器,而不是传入
begin()

谢谢!这很有效。我使用了
reserve
back\u inserter()
。可以找到解决办法。
transform((*numbers).begin(), (*numbers).end(), (*result).begin(),
        [this](int x){ return factor * x; });
    shared_ptr<vector<int> > result(new vector<int>() );
    transform(numbers->begin(), numbers->end(), result->begin(),
        [this](int x){ return factor * x; });
shared_ptr<vector<int> > result(new vector<int>(numbers->size()) );