Инициализация статического вектора
Интересно, есть ли более "хороший" способ инициализации статического вектора, чем ниже?
class Foo
{
static std::vector<int> MyVector;
Foo()
{
if (MyVector.empty())
{
MyVector.push_back(4);
MyVector.push_back(17);
MyVector.push_back(20);
}
}
}
Это пример кода:)
Значения в push_back() объявляются независимо; не в массиве или чем-то.
Изменить: если это невозможно, скажите мне, что также:)
Ответы
Ответ 1
Как правило, у меня есть класс для создания контейнеров, которые я использую (например, этот от boost), что вы можете сделать:
const list<int> primes = list_of(2)(3)(5)(7)(11);
Таким образом, вы также можете создать статический const, чтобы избежать случайных изменений.
Для статики вы можете определить это в файле .cc:
// Foo.h
class Foo {
static const vector<int> something;
}
// Foo.cc
const vector<int> Foo::something = list_of(3)(5);
В С++ Ox у нас будет язык для этого, используя списки инициализаторов, поэтому вы можете просто сделать:
const vector<int> primes({2, 3, 5, 7, 11});
Смотрите здесь.
Ответ 2
В С++ 03 самым простым способом было использование функции factory:
std::vector<int> MakeVector()
{
std::vector v;
v.push_back(4);
v.push_back(17);
v.push_back(20);
return v;
}
std::vector Foo::MyVector = MakeVector(); // can be const if you like
"Оптимизация возвращаемого значения" должна означать, что массив заполняется на месте и не копируется, если это вызывает беспокойство. Кроме того, вы можете инициализировать из массива:
int a[] = {4,17,20};
std::vector Foo::MyVector(a, a + (sizeof a / sizeof a[0]));
Если вы не против использовать нестандартную библиотеку, вы можете использовать Boost.Assignment:
#include <boost/assign/list_of.hpp>
std::vector Foo::MyVector = boost::list_of(4,17,20);
В С++ 11 или более поздней версии вы можете использовать инициализацию brace:
std::vector Foo::MyVector = {4,17,20};
Ответ 3
С С++ 11:
std::vector<int> Foo::MyVector = {4, 17, 20};
Ответ 4
Вы можете попробовать следующее:
int arr[] = { 1,2,3,4,5,6,7,8,9 };
MyVector.insert(MyVector.begin(), arr, &arr[sizeof(arr)/ sizeof(*arr)]);
Но это, вероятно, стоит только, когда у вас действительно длинный вектор, и он выглядит не намного приятнее. Однако вы избавляетесь от повторных вызовов push_back(). Конечно, если ваши значения "не в массиве", вам придется сначала их перенести, но вы сможете сделать это статически (или, по крайней мере, ссылки/указатели), в зависимости от контекста.
Ответ 5
Как насчет инициализации с использованием статического объекта. В его конструкции это
может вызвать статическую функцию в объекте для инициализации.
Ответ 6
с boost вы можете использовать оператор + =(), определенный в пространстве имен boost:: assign.
#include <boost/assign.hpp>
using namespace boost::assign;
int main()
{
static std::vector<int> MyVector;
MyVector += 4,17,20;
return 0;
}
или со статической инициализацией:
#include <boost/assign.hpp>
using namespace boost::assign;
static std::vector<int> myVector = list_of(4)(17)(2);
int main()
{
return 0;
}
или даже лучше, если ваш компилятор поддерживает С++ 11, используйте списки инициализации.