Подтвердить что ты не робот

Инициализация статического вектора

Интересно, есть ли более "хороший" способ инициализации статического вектора, чем ниже?

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() объявляются независимо; не в массиве или чем-то.

Изменить: если это невозможно, скажите мне, что также:)

4b9b3361

Ответ 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, используйте списки инициализации.