Ste*_*reo 5 c++ lambda transform shared-ptr c++11
我正在尝试将变换应用于a shared_ptr并存储一段shared_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;
}
Run Code Online (Sandbox Code Playgroud)
从这里可以看出,这会导致分段转储.有关如何解决这个问题的任何帮助,以便输出产量{2, 4, 6, }?
请注意,我使用lambda是因为我在完整实现中需要它.
我也试过替换,
transform(numbers->begin(), numbers->end(), result->begin(),
[this](int x){ return factor * x; });
Run Code Online (Sandbox Code Playgroud)
同
transform((*numbers).begin(), (*numbers).end(), (*result).begin(),
[this](int x){ return factor * x; });
Run Code Online (Sandbox Code Playgroud)
shared_ptr<vector<int> > result(new vector<int>() );
Run Code Online (Sandbox Code Playgroud)
您构造一个新的空向量。
transform(numbers->begin(), numbers->end(), result->begin(),
[this](int x){ return factor * x; });
Run Code Online (Sandbox Code Playgroud)
由于result为空,result->begin()因此返回结束迭代器值。std::transform复制输入序列,应用转换 lambda,并将转换结果写入输出迭代器。
由于向量是空的,因此没有什么可写入的。您运行超过了空数组的末尾,导致未定义的行为和内存损坏。
在这种情况下,只需预先分配输出数组,因为您提前知道它的大小应该是多少:
shared_ptr<vector<int> > result(new vector<int>(numbers->size()) );
Run Code Online (Sandbox Code Playgroud)
现在,这将创建正确大小的输出数组,begin()将迭代器返回到数组的开头,并std::transform()愉快地在数组上乱写乱画。
如果您确实希望避免值初始化新数组的额外开销,只是为了覆盖它,您可以使用reserve()预分配数组的最终大小,然后使用 astd::back_insert_iterator作为输出迭代器,而不是传入begin().
| 归档时间: |
|
| 查看次数: |
309 次 |
| 最近记录: |