OpenGL требует непрерывного массива элементов. По понятным и понятным причинам, эффективный способ вставить один элемент в непрерывный массив отсутствует. Это обязательно не менее O (N).
Однако вы потенциально можете добавить N элементов меньше, чем O (N ^ 2), которое вектор достигает для N случайных вставок.
Например, если вы на самом деле не добавляете новые вершины «по любому индексу», но всегда близки к предыдущему, вы можете добавить все элементы в std :: list (O (1) для каждого элемента, O (N) всего), затем скопируйте список std :: list в вектор std :: vector. На самом деле это не обязательно должен быть предыдущий элемент , просто a предыдущий элемент, поэтому, если порядок основан на рекурсивном обходе некоторого дерева, вы все равно сможете сделай это.
Если новые вершины добавляются по индексу, определяемому линейным порядком, добавьте все элементы в std :: map или std :: multi_map (O (log N) на элемент, всего O (N log N)) , затем скопируйте это в вектор.
Таким образом, самый простой способ сделать это зависит от того, как определяется порядок. Являются ли эти решения с более низкой сложностью на самом деле быстрее , чем вектор, зависит от N. У них гораздо более высокие издержки (O (N) распределения вместо O (log N) для вектора), поэтому N, возможно, придется быть довольно большим, прежде чем начнется асимптотическое поведение.
Если вы используете любое из описанных мной решений, простой / эффективный способ скопировать список или карту в вектор выглядит так:
std::vector<glVertex3f> vec;
vec.reserve(listormap.size());
vec.insert(vec.begin(), listormap.begin(), listormap.end());