声明后构造stl容器

时间:2013-01-10 05:10:59

标签: c++ stl

如果我有一个因子函数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);

有更好的方法吗?

由于

2 个答案:

答案 0 :(得分:3)

IntVec retval;

所有这一切都是一个空的向量。它已初始化,但就内容而言,为空,您可以根据需要添加它。

另外,

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

这是合法的。

实例确实被f的返回覆盖,但效率命中可以忽略不计,我怀疑你经常运行这个功能。

你也可以这样做..

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

如果您的if声明与您展示的一样简单。

最后指针的示例存在缺陷

我猜pinstance很快会在instance之前被销毁,在这种情况下,instance会成为悬空参考

答案 1 :(得分: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中没有内容,因为它已与空向量实例交换。

看起来你已经掌握了悬挂参考资料,所以我会在你的问题的第二部分留下它。