簡體   English   中英

C ++ 11使用shared_ptr轉換為向量和類

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM