Как инициализировать вектор const std в старом c ++? - PullRequest
5 голосов
/ 20 февраля 2020

Мой идентификатор компилятора C ++ - GNU 4.4.1

Я думаю, что с c ++ 11 вы можете инициализировать вектор следующим образом:

const std::vector<int> myVector = {1, 2, 3};
const std::vector<int> myVector2{1, 2, 3};

К сожалению, я не использую c ++ 11, поэтому myVector может быть просто инициализирован конструктором. Мне нужно создать вектор, который никогда не будет изменен. Он должен быть общим для разных функций в классе, поэтому он может быть и stati c, или даже членом класса. Есть ли способ сделать мой вектор инициализированным, когда он будет определен в c ++ 98, как примеры выше, или что-то эквивалентное?

Ответы [ 3 ]

7 голосов
/ 20 февраля 2020

Вы можете вернуть вектор из функции:

std::vector<int> f();
const std::vector<int> myVector = f();

Либо используйте boost :: assign :: list_of .

3 голосов
/ 20 февраля 2020

Вы уже получили два хороших ответа. Это просто сочетание обоих:

namespace detail {
    template<typename T, size_t N>
    size_t size(const T (&)[N]) { return N; }

    std::vector<int> vecinit() {
        int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
        return std::vector<int>(arr, arr+size(arr));
    }
}

//...

const std::vector<int> myVector(detail::vecinit());
3 голосов
/ 20 февраля 2020

@ vll ответ, вероятно, лучше, но вы также можете сделать:

int temp[] = {1, 2, 3};
const std::vector<int> myVector(temp, temp + sizeof(temp)/sizeof(temp[0]));

Однако он создает две копии вместо одной и загрязняет пространство имен именем массива.

...