[英]C++11 transform with shared_ptr to a vector and class
我正在嘗試將轉換應用於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;
}
從這里可以看出,這會導致分段轉儲。 有關如何解決這個問題的任何幫助,以便輸出產生{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()
返回結束迭代器值。 std::transform
復制輸入序列,應用轉換lambda,並將轉換后的結果寫入輸出迭代器。
由於向量是空的,因此無需寫入。 您正在運行空數組的末尾,導致未定義的行為和內存損壞。
在這種情況下,只需預先分配輸出數組,因為您事先知道它的大小應該是什么:
shared_ptr<vector<int> > result(new vector<int>(numbers->size()) );
現在,這將創建正確大小的輸出數組, begin()
將返回一個迭代器到數組的開頭, std::transform()
將很樂意在數組上亂寫。
如果你真的希望避免額外的初始化新數組的開銷,只是為了覆蓋它,你可以使用reserve()
來預分配數組的最終大小,然后使用std::back_insert_iterator
作為輸出迭代器,而不是傳入begin()
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.