C++11 将 shared_ptr 转换为向量并 class
C++11 transform with shared_ptr to a vector and class
我正在尝试将转换应用到 shared_ptr
并存储到 shared_ptr
,同时还在 class.
中使用函数
我创建了这个例子:
#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;
}
可以看出here 这会导致分段转储。关于如何解决此问题以使输出产生 {2, 4, 6, }
?
的任何帮助
请注意,我使用 lambda 是因为在我的完整实施中需要它。
我也试过替换,
transform(numbers->begin(), numbers->end(), result->begin(),
[this](int x){ return factor * x; });
和
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; });
由于 result
为空,result->begin()
return 是结束迭代器值。 std::transform
复制输入序列,应用转换 lambda,并将转换结果写入输出迭代器。
由于向量为空,因此没有可写入的内容。您 运行 超出了空数组的末尾,导致未定义的行为和内存损坏。
在这种情况下,只需预先分配输出数组,因为您事先知道它的大小:
shared_ptr<vector<int> > result(new vector<int>(numbers->size()) );
现在,这将创建正确大小的输出数组,begin()
将 return 一个指向数组开头的迭代器,std::transform()
将愉快地在数组上涂鸦.
如果您真的希望避免对新数组进行值初始化的额外开销,只是为了覆盖它,您可以使用 reserve()
预分配数组的最终大小,然后使用 std::back_insert_iterator
用于输出迭代器,而不是传入 begin()
.
我正在尝试将转换应用到 shared_ptr
并存储到 shared_ptr
,同时还在 class.
我创建了这个例子:
#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;
}
可以看出here 这会导致分段转储。关于如何解决此问题以使输出产生 {2, 4, 6, }
?
请注意,我使用 lambda 是因为在我的完整实施中需要它。
我也试过替换,
transform(numbers->begin(), numbers->end(), result->begin(),
[this](int x){ return factor * x; });
和
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; });
由于 result
为空,result->begin()
return 是结束迭代器值。 std::transform
复制输入序列,应用转换 lambda,并将转换结果写入输出迭代器。
由于向量为空,因此没有可写入的内容。您 运行 超出了空数组的末尾,导致未定义的行为和内存损坏。
在这种情况下,只需预先分配输出数组,因为您事先知道它的大小:
shared_ptr<vector<int> > result(new vector<int>(numbers->size()) );
现在,这将创建正确大小的输出数组,begin()
将 return 一个指向数组开头的迭代器,std::transform()
将愉快地在数组上涂鸦.
如果您真的希望避免对新数组进行值初始化的额外开销,只是为了覆盖它,您可以使用 reserve()
预分配数组的最终大小,然后使用 std::back_insert_iterator
用于输出迭代器,而不是传入 begin()
.