12

私は C++11 のスマート ポインターにかなり慣れていないので、プロジェクトで効果的に使用しようとしています。私のプロジェクトでは、次のように、vectorofへの const 参照を取り、unique_ptrそれに対していくつかの計算を行い、いくつかの結果を戻りパラメーターに配置する多くの関数があります。

void computeCoefficients(const vector<unique_ptr<Scalar>>& roots, 
    vector<unique_ptr<Scalar>>& coeffs) {
    ...
}

私が使用してunique_ptrいるのは、これらすべての関数を呼び出すプロシージャが 内のオブジェクトの唯一の所有者でvectorあり、関数がオブジェクトを入力として読み取るためにオブジェクトを「借用」しているだけだからです。

今、私は受け取った のさまざまなサブセットで計算を行う関数を作成しようとしています。そのためには、 を受け取るさらに別の関数に渡すために、それらのサブセットを含むvectorのさまざまな「バージョン」が必要です。入力として。しかし、ベクトルのサブセットを取得する唯一の方法は、そのコピーを作成することです。s はコピーできないため、これは問題です。コードを次のようにしたいと思います。vectorvector<unique_ptr<Scalar>>unique_ptr

void computeOnSet(const vector<unique_ptr<Scalar>>& set, unique_ptr<Scalar>& output) {  
    ...
}

void computeOnAllSubsets(const vector<unique_ptr<Scalar>>& set, vector<unique_ptr<Scalar>>& outputs) {
    for(int i = 0; i < input.size(); i++) {
        auto subset = vector<unique_ptr<Scalar>>(set.begin(), set.begin()+i);
        subset.insert(subset.end(), set.begin()+i+1, set.end();
        computeOnSubset(subset, outputs.at(i));
    }
}

もちろん、それはうまくいきません。unique_ptrs をsに置き換えれば動作させることができますshared_ptrが、これには 2 つの問題があります。

  • 哲学的には、セットの所有権を関数と共有していることを意味しcomputeOnSubsetsますが、そうではありません。呼び出し元はまだ唯一の所有者です。(これshared_ptrは、コピーを持つすべてのものと所有権を共有していることを意味します)。
  • すべてのメソッドの入力パラメーターをvector<shared_ptr<Scalar>>.

私がやりたいことは、一時的な読み取り専用のサブベクトルを作成するためだけに、ポインターの一時的な読み取り専用のコピーを作成することだけです。これを行う方法はありますか?私が必要としているもののように聞こえますが (非所有の一時ポインター)、それは でのみ使用できます。weak_ptrshared_ptr

4

2 に答える 2

2

iterator を使用すると、コードがより汎用的になる場合があります。次のように計算関数を宣言するだけです。

template <typename InputIt, typename OutputIt>
void compute(InputIt first_it, InputIt last_it, OutputIt d_first, Output d_last);

この計算関数テンプレートは、範囲 内のデータを処理し[first_it, last_it)、結果を に入れ[d_first, d_last)ます。入力コンテナまたは出力コンテナのタイプは気にしません。イテレータは、STL の考え方であるコンテナ内の要素へのポインタとして機能します。

さらに、場合によっては、範囲を手動で通過することすらありません。や<algorithm>などの関数テンプレートを使用するだけです。std::for_eachstd::transform

のコード スニペットはよくわかりませんが、本能的に役立つcomputeOnAllSubsetsと思います。std::transform

于 2013-04-09T09:09:29.167 に答える