станд.:: вектор и массивы c-стиля

Это - метод программирования основанного вокруг описания , что что-то должно сделать или быть вместо того, чтобы описать , как это должно работать.

, Другими словами, Вы не пишете алгоритмы, сделанные из выражений, Вы просто расположение, как Вы хотите вещи быть. Двумя хорошими примерами является HTML и WPF.

статья This Wikipedia является хорошим обзором: http://en.wikipedia.org/wiki/Declarative_programming

9
задан Grzegorz Wierzowiecki 21 January 2012 в 20:28
поделиться

4 ответа

Существуют ли гарантии реализации в stl, что вектор внутри является последовательным в памяти?

Что касается C ++ 03, да, вектор гарантированно использует непрерывную память. (В C ++ 98 была случайная лазейка, поэтому реализация могла гипотетически использовать несмежное хранилище, но это было исправлено в версии стандарта 2003 года - и никакая реализация на самом деле не использовала несмежное хранилище потому что это было бы ужасной идеей)

Можно ли безопасно преобразовать std :: vector в int * и ожидать, что это сработает?

Обычный способ - & v [0] . ( & * v.begin () , вероятно, тоже будет работать, но я, кажется, припоминаю, что в стандарте есть некоторая расплывчатая формулировка, которая делает это не на 100% надежным)

Нет. Почему вы ожидали, что это сработает? Вектор - это класс. Это не указатель. Он просто содержит указатель.

В случае вектора векторов, могу ли я предположить, что это верно? Я ожидал, что вектор будет содержать другие данные о состоянии или проблемы с выравниванием, или, может быть, что-то еще ...

Вектор ведет себя так же, как и все, что вы в нем храните. Если вы создадите вектор из векторов, вы получите объект, который содержит указатель на массив, выделенный кучей, где каждый элемент является объектом, который содержит указатель на массив, выделенный кучей.

Что касается того, как вы должны Подходите к этому, это зависит от множества факторов. Насколько велик ваш общий набор данных? Возможно, вы захотите, чтобы вся таблица была размещена непрерывно. В векторе векторов каждая строка выделяется отдельно.

это зависит от множества факторов. Насколько велик ваш общий набор данных? Возможно, вы захотите, чтобы вся таблица была размещена непрерывно. В векторе векторов каждая строка выделяется отдельно.

это зависит от множества факторов. Насколько велик ваш общий набор данных? Возможно, вы захотите, чтобы вся таблица была размещена непрерывно. В векторе векторов каждая строка выделяется отдельно.

17
ответ дан 4 December 2019 в 08:15
поделиться
  • Есть ли гарантии реализации в stl, которым является вектор,
    внутренне, последовательно в памяти

Да, это динамический массив. Стандартные гарантии, что объекты внутри вектора сохраняются последовательно.

  • Могу ли я безопасно преобразовать std :: vector в int * и ожидать, что это сработает?

Нет, но вы можете использовать begin () и использовать это как указатель .

  • Есть ли гарантии реализации в stl, которым является вектор,
    внутренне, последовательно в памяти

Нет, поскольку вектор может содержать некоторые внутренние переменные-члены, весь 2D-массив не будет непрерывной ячейкой памяти

4
ответ дан 4 December 2019 в 08:15
поделиться

В комментарии вы упомянули, что работаете с данными размером до 2500x2500x (двойные). В этом случае я бы предложил использовать один единственный вектор вместо вектора векторов. Выделите элементы NxM в векторе и оберните его в класс, предоставляющий двумерную индексацию, если хотите. Вы получаете все преимущества вектора с минимальными накладными расходами, и все ваши данные по-прежнему находятся в непрерывной памяти для быстрой обработки.

2
ответ дан 4 December 2019 в 08:15
поделиться

Существуют ли гарантии реализации в stl, что вектор внутри является последовательным в памяти?

Хотя я не могу здесь цитировать стандарты, я видел код в высококачественных библиотеках, предполагающий эту схему (а именно, POCO ).

Могу ли я безопасно преобразовать std :: vector в int * и ожидать, что это сработает?

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

std::vector<int> vec;
int* ptr = &vec[0];

В случае вектора векторов, могу ли я предположить, что это верно? Я ожидал, что вектор будет содержать другие данные о состоянии или проблемы с выравниванием, или, может быть, что-то еще ...

Вероятно, вы не можете преобразовать вектор векторов в линейный массив. Каждый вектор резервирует свой собственный диапазон памяти, и вы не можете ожидать, что все эти диапазоны будут последовательными.

3
ответ дан 4 December 2019 в 08:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: