gpt4 book ai didi

C++11 将 shared_ptr 转换为 vector 和类

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:33:19 25 4
gpt4 key购买 nike

我正在尝试将转换应用到 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;
}

可以看出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>() );

你构建了一个新的空 vector 。

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

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

因为 vector 是空的,所以没有什么可写的。您跑过空数组的末尾,导致未定义的行为和内存损坏。

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

shared_ptr<vector<int> > result(new vector<int>(numbers->size()) );

现在,这将创建正确大小的输出数组,begin() 将返回一个指向数组开头的迭代器,而 std::transform() 会愉快地在阵列上涂鸦。

如果你真的希望避免对新数组进行值初始化的额外开销,只是为了覆盖它,你可以使用 reserve() 来预分配数组的最终大小,然后使用 std::back_insert_iterator 用于输出迭代器,而不是传入 begin()

关于C++11 将 shared_ptr 转换为 vector 和类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39432480/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com