0

因子関数がある場合f

typedef std::vector<int> IntVec;
const IntVec f(...) {
    IntVec retval;
    ...
    return retval;
}

そして私は次のように宣言後に定義を遅らせる必要があります:

IntVec instance;
if (...) {
    instance = f(a, ...);
}
else {
    instance = f(b, ...);
}

それを行うための提案された方法はありますか?


今、私はそれを次のようにするためにコンテナのポインタを使用します:

std::auto_ptr<IntVec> pinstance(NULL);
if (...) {
    pinstance.reset(new IntVec(f(a, ...)));
}
else {
    pinstance.reset(new IntVec(f(b, ...)));
}
IntVec& instance(*pinstance);

もっと良い方法はありますか?

ありがとう

4

2 に答える 2

3

IntVec retval;

これが作成するのは空のベクトルだけです。初期化されていますが、内容が空である限り、必要に応じて追加できます。

また、

IntVec instance;
if (...) {
    instance = f(a, ...);
}
else {
    instance = f(b, ...);
}

これは合法です。

インスタンスはの戻りによって上書きされますがf、効率の低下はごくわずかであり、この関数を頻繁に実行しているとは思えません。

また、あなたはこのようなことをすることができます。

IntVec instance = f(...?a:b,...);
                    //if

あなたのifステートメントがあなたがそれを示すのと同じくらい単純であるならば。

最後に、ポインタを使用した例に欠陥があります。

pinstanceすぐ前に破棄されると思いますがinstance、その場合instanceぶら下がり参照になります。

于 2013-01-10T05:12:47.213 に答える
1

C ++ 11を使用すると、データ型がムーブ代入をサポートしている場合、スワッピングは非常に効率的になります。

#include <iostream>
#include <vector>
#include <string>
#include <ctime>
using namespace std;

int main()
{
    std::vector<int> inst;
    std::srand((unsigned)time(0));

    // code to set condition.
    if (rand()%2)
    {
        std::vector<int> v1(10,10);
        std::swap(inst, v1);

        cout << "V1" << endl;
        std::copy(v1.begin(), v1.end(), ostream_iterator<int>(cout,"\n"));
    }
    else
    {
        std::vector<int> v2(11,11);
        std::swap(inst, v2);

        cout << "V2" << endl;
        std::copy(v2.begin(), v2.end(), ostream_iterator<int>(cout,"\n"));
    }

    cout << "Instance" << endl;
    std::copy(inst.begin(), inst.end(), ostream_iterator<int>(cout,"\n"));

    return 0;
}

出力

V2
Instance
11
11
11
11
11
11
11
11
11
11
11

空のベクトルinstと交換されているため、V2にはコンテンツがないことに注意してください。

ぶら下がっているリファレンスをすでに理解しているようですので、質問の2番目の部分では省略します。

于 2013-01-10T05:59:46.157 に答える