如何在函数调用之间存储deque值

时间:2013-12-30 12:25:08

标签: c++ stl

例如:

#include <iostream>
#include <deque>

int func(int a){
  std::deque<int> obj;
  obj.push_back(a);
  for(std::deque<int>::iterator it = obj.begin(); it!=obj.end();++it)
    std::cout << *it << '\n';
  return 0;
}
int main()
{
  int x=2;

  func(x);
  func(x);
}

输出为:

2  
2

所以它的意思是deque对象在达到func的结束范围后销毁。我不能对此做任何事情,除了返回值或添加到全局范围?无法通过向他或静态指针或其他东西添加静态来更改此对象的行为?我的意思是使用纯C ++看起来像:

int func(int a){
  static int *p = new int;
}

和值将存储在函数调用之间但是如何对我不知道的stl容器执行相同的操作。

3 个答案:

答案 0 :(得分:2)

如果你真的希望它是静态的,那么就这样做:

static std::deque<int> obj;

虽然这可能是一个坏主意:从概念上讲,你在程序中隐藏了状态,实际上,在它被销毁之后有可能访问该对象。 (你可以通过使用动态分配和泄漏对象来解决生命周期问题,如Drax的回答所示,如果你真的想要走这条特殊的痛苦之路)。

最好将状态封装在一个类中。然后,您可以准确控制何时创建和销毁,并且如果您愿意,可以拥有多个实例。

class thing {
public:
    int func(int a) {
        obj.push_back(a);
        // and print it
    }
private:
    std::deque<int> obj;
};

int main() {
    thing t;
    t.func(2);  // 2
    t.func(3);  // 2 3
}

答案 1 :(得分:2)

如果您想记住函数调用之间的数据,请将其存储在其他位置,或作为最后的手段将其设置为静态。 因此,要么选择Mike Seymour的答案,使其成为一个类的成员,要么在main中保留它,并将其传递给函数,如果您想要更改它,请确保通过引用传递:

int func(int a, std::deque<int> & obj){
  //.. as you were
}

从main获取数据并传入:

int main()
{
  int x=2;
  std::deque<int> obj;

  func(x, obj);
  func(x, obj);
}

答案 2 :(得分:0)

简单地说:

int func(int a){
  static std::deque<int>* obj = new std::deque<int>;
  obj->push_back(a);
  for(std::deque<int>::iterator it = obj->begin(); it!=obj->end();++it)
    std::cout << *it << '\n';
}

但我不确定这是个好主意:)。