Теперь, серьезно ... Я воздержусь от использования здесь плохих слов, потому что мы говорим о Boost. Должно быть моей ошибкой смотреть на вещи таким образом, но я не могу понять почему, поэтому я спрошу это здесь; Может быть, кто-то может просветить меня в этом вопросе. Вот оно:
У uBLAS есть замечательный шаблон класса под названием bounded_vector<>
, который используется для создания векторов фиксированного размера (или так я думал).
Из вики UBLAS Effective (http://www.crystalclearsoftware.com/cgi-bin/boost_wiki/wiki.pl?Effective_UBLAS):
)
Тип вектора uBLAS и матрицы по умолчанию имеют переменный размер. Многие задачи линейной алгебры включают векторы с фиксированным размером. 2 и 3 элемента являются общими в геометрии! Хранилище фиксированного размера (похожее на массивы C) может быть эффективно реализовано, так как оно не связано с накладными расходами (управлением кучей), связанными с динамическим хранением. uBLAS реализует фиксированные размеры, изменяя базовое хранилище вектора / матрицы на «bounded_array» со значения по умолчанию «unbounded_array».
Хорошо, эта вещь bounded_vector<>
используется, чтобы освободить вас от указания основного хранилища вектора для bounded_array<>
указанного размера. Здесь я спрашиваю вас: не похоже ли, что эта ограниченная векторная вещь имеет фиксированный размер? Ну, это не так.
Сначала я чувствовал себя преданным вики, но потом я пересмотрел значение слова «ограниченный» и думаю, что могу позволить этому пройти. Но в случае, если вы, как и я (я все еще не уверен), все еще задаетесь вопросом, имеет ли это смысл, я обнаружил, что bounded_vector<>
на самом деле может быть изменен, он может быть только больше чем размер, указанный в качестве параметра шаблона.
- Итак, во-первых, вы думаете, у них была веская причина не делать настоящие >> фиксированные << размер вектора или тип матрицы? </li>
- Как вы думаете, можно ли "продавать" этот ограниченный - в отличие от фиксированного размера - вектор для пользователей моей библиотеки как "фиксированного размера" замена вектора, даже названного "Vector3" или "Vector2", как это сделала вики-программа Uffective UBLAS?
- Как вы думаете, я должен как-то реализовать вектор с фиксированным размером для этой цели? Если так, то как? (Извините, но я действительно новичок в UBLAS; только что попробовал сегодня)
- Я занимаюсь разработкой 3D-игры. Следует ли использовать uBLAS для вычислений, связанных с этим («эй, геометрия!», Согласно действующей вики uBLAS)? Какую замену вы бы предложили, если нет?
- редактировать
И на всякий случай, да, я прочитал это предупреждение:
Следует отметить, что это только меняет хранилище, которое uBLAS использует для вектора3. uBLAS будет по-прежнему использовать тот же алгоритм (который предполагает переменный размер) для управления вектором3. На практике это, похоже, не оказывает негативного влияния на скорость. Вышеприведенное работает так же быстро, как и созданный вручную вектор3, который не использует uBLAS. Единственное негативное влияние состоит в том, что vector3 всегда хранит элемент «size», который в этом случае является избыточным [или нет? Я имею в виду ......].
Я вижу, что он использует тот же алгоритм, предполагая переменный размер, но если операция фактически изменит свой размер, разве она не должна быть остановлена (утверждение)?
ublas::bounded_vector<float,3> v3;
ublas::bounded_vector<float,2> v2;
v3 = v2;
std::cout << v3.size() << '\n'; // prints 2
Да ладно, разве это не просто предательство?