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

注意 V2 中没有内容,因为它已与空向量 inst 交换。

看起来你已经掌握了悬空参考,所以我将把它留到你问题的第二部分。

于 2013-01-10T05:59:46.157 回答