我希望能够在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
}
但问题是我想将向量的第一项初始化为某个值,将另一项初始化为另一个值。
有一种简单的方法吗?
答案 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)
答案 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() {
}