在C ++中的main()之前初始化一个向量

时间:2009-04-25 11:05:00

标签: c++ stl static vector

我希望能够在main之前初始化一个大小为'SIZE'的向量。通常我会做

static vector<int> myVector(4,100);

int main() {

    // Here I have a vector of size 4 with all the entries equal to 100

}

但问题是我想将向量的第一项初始化为某个值,将另一项初始化为另一个值。

有一种简单的方法吗?

8 个答案:

答案 0 :(得分:20)

试试这个:

static int init[] = { 1, 2, 3 };
static vector<int> vi(init, init + sizeof init / sizeof init[ 0 ]);

另外,请参阅std::generate(如果要在函数中初始化)。

答案 1 :(得分:10)

或者只是创建一个函数并调用:

std::vector<int> init()
{
  ...
}

static std::vector<int> myvec = init()

或许有点效率低下,但现在对你来说可能并不重要,而且使用C ++ 0x并移动它会非常快。

如果要避免复制(对于C ++ 03及更早版本),请使用智能指针:

std::vector<int>* init() { 
    return new std::vector<int>(42);
}

static boost::scoped_ptr<std::vector<int>> myvec(init());

答案 2 :(得分:9)

C ++ 0x将允许标准容器的初始化列表,就像聚合:

std::vector<int> bottles_of_beer_on_the_wall = {100, 99, 98, 97};

显然尚未标准,但据称得到GCC 4.4的支持。我在MSVC中找不到它的文档,但是Herb Sutter一直在说他们的c ++ 0x支持在委员会之前...

答案 3 :(得分:8)

您可以使用Boost's comma-separated list

答案 4 :(得分:7)

有点hackish,但你可以这样做:

struct MyInitializer {
   MyInitializer() {
       myVector[0]=100;
       //...
   }
} myInitializer;  // This object gets constructed before main()

答案 5 :(得分:6)

这是另一种解决方案:

#include <vector>                  
static std::vector<int> myVector(4,100);

bool init()
{
    myVector[0] = 42;      
    return true;
}

bool initresult = init();

int main()                  
{
    ;
}

答案 6 :(得分:3)

我建议不要使用全局,而是建议使用本地静态。由于矢量的初始化发生在输入main之前,因此抛出的任何异常都不会被main捕获。比方说,你有一个类型,当它被构造时可能抛出异常:

class A {
public:
  A() { 
    // ... code that might throw an exception
  }
};

对于以下初始化,main主体中的try / catch将不会捕获构造函数抛出的异常,因此您的程序将立即死亡,您甚至可能无法使用调试器来查找事业!

std::Vector<A> v(5, A());  // May throw an exception here not caught by main

int main () {
  try {
     // Exception for 'v' not handled here.
  }
  catch (...) {
  }
}

从构造函数中捕获异常的另一种方法是使用本地静态 - 使用此answer建议的技术初始化。

std::Vector<A> init ();  // Returns a vector appropriately initialized

std::vector<A> & getV () {
  static std::vector<A> cache = init();
  return cache;
}

int main () {
  try {
     getV().at[0];    // First call to getV - so initialization occurs here!
  }
  catch (...) {
  }
}

答案 7 :(得分:0)

通过课程包装:

class SpecialVector
{
  public:
    SpecialVector()
    {
      myVector[0] = 1;
      myVector[1] = 4;
      // etc.
    }
    const vector<int> & GetVector() const
    {
      return myVector;
    }
  private:
    vector<int> myVector;
 };
 static SpecialVector SpVec;

 int main() {
 }