Многомерная векторная инициализация - PullRequest
9 голосов
/ 27 июня 2011

У меня есть следующая std::vector декларация:

std::vector<std::vector<std::vector<int> > > m_input;

Я инициализирую ее следующим образом:

    m_input.resize (100);
    m_output.resize(100);
    for (int i = 0; i < 100; ++i) {
        m_input [i].resize(100);
        m_output[i].resize(100);
        for (int j = 0; j < 100; ++j){
            m_input [i][j].resize(100);
            m_output[i][j].resize(100);
        }
    }

Как этого добиться с помощью список инициализирующих элементов ?

Ответы [ 3 ]

17 голосов
/ 27 июня 2011

std::vector<T> имеет конструктор, который принимает два аргумента, число элементов и начальное значение. В вашем случае вы хотите инициализировать m_input 100 копиями std::vector<std::vector<int> >, так что это будет : m_input(100, X). Теперь этот X, в свою очередь, является вектором 100 std::vector<int>, который, в свою очередь, содержит сотню целых:

: m_input(100, std::vector<std::vector<int> >(100, std::vector<int>(100, 0)))

6 голосов
/ 27 июня 2011
my_class::my_class()
 : m_input(100, std::vector< std::vector<int> >(100, std::vector<int>(100) ))
{
}

Тем не менее, внедрение многомерного поля должно быть сделано путем проецирования в одномерное, как сказал Виктор в своем комментарии к вопросу.

0 голосов
/ 30 октября 2013

Если вы можете утверждать, что ваши векторные размеры будут фиксированной длины, то почему бы не использовать std::array?

Например:

std:array<std::array<std::array<int, 100>, 100>, 100>

Таким образом, вы можете воспользоваться преимуществами всей непрерывно выделяемой памяти (на что намекает Viktor_Sehr в комментариях), без дополнительных проблем реализации доступа к 1-мерному массиву в 3-мерном способ.

...