Можете ли вы использовать размер вектора в качестве длины массива? - PullRequest
1 голос
/ 23 января 2011

У меня есть std :: vector, определенный как:

std::vector<glm::vec3> faces;

И я хочу использовать размер этого вектора в качестве длины массива с плавающей точкой. Сейчас я пытаюсь сделать это так:

float vertices[faces.size()][3];

Но я продолжаю получать сообщения о том, что вы должны использовать постоянное значение. Я подумал, может быть, это потому, что размер вектора может измениться, поэтому я попробовал это вместо этого:

const int size = faces.size();
float vertices[size][3];

Но я все еще получаю ту же ошибку. Возможно ли это сделать?

Ответы [ 4 ]

4 голосов
/ 23 января 2011

Почему вы все равно хотите использовать массив C? vector было бы гораздо более подходящим здесь.

vector<vector<float> > vertices(faces.size(), vector<float>(3));

И если вы уже знаете, что размер внутреннего вектора и его размер фиксированы, можно с уверенностью сказать, что структура будет лучше подходить, чем вектор:

struct vertex {
    float x;
    float y;
    float z;
};

vector<vertex> vertices(faces.size());

Полезность векторов в стиле C строго ограничена в C ++. Единственное использование в основном, если вы знаете их размер (и обычно также содержимое) во время компиляции и используете их как прославленную константу. Для всего остального существуют лучшие контейнеры. И даже эта ниша заполнена в следующем стандарте std::array.

2 голосов
/ 23 января 2011

Не в стандартном C ++ (хотя я считаю, что некоторые компиляторы предлагают его как нестандартное расширение языка).

Вы можете сделать что-то вроде:

float (*vertices)[3] = new int[faces.size()][3];

Обратите внимание, что теперь это выделено в куче, поэтому вам нужно delete [] vertices в какой-то момент.

1 голос
/ 23 января 2011

Проблема, с которой вы сталкиваетесь, заключается в том, что вы пытаетесь использовать неконстантное выражение для создания размера массива во время компиляции. Vector :: size является операцией во время выполнения. Во втором примере, хотя вы можете подумать, что вы умны, компилятор, скорее всего, оптимизирует эту переменную и выведет, что вы фактически используете некоторое количество, которое будет известно только во время выполнения.

Если вам не требуется интеграция с библиотекой C или чем-то устаревшим (я вижу, что вы используете вызовы OpenGL, которые являются C), я бы посоветовал вам взглянуть на Boost :: multi_array . Следовательно,

boost::multi_array<float,2> myFloats(boost::extents[myVector.size()][3]);
0 голосов
/ 23 января 2011

Вы не можете определить массив объектов в стеке (так называемые автоматические переменные) с непостоянным размером массива.Размер массива должен быть известен во время компиляции.Как еще компилятор узнает, сколько стекового пространства резервировать для массива?

Если вам нужен массив, размер которого не определяется до времени выполнения, вы должны использовать оператор new для определения массива в куче.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...