Как скопировать содержание станд.:: вектор к c-стилю статический массив, безопасно?

EL интерпретирует ${class.name} как описано - имя становится getName () в предположении, что вы используете явные или неявные методы генерации getter / seters

. Вы можете переопределить это поведение, явно указав имя как функция: ${class.name()} Это вызывает имя функции () напрямую без изменений.

14
задан mhd 11 March 2009 в 06:34
поделиться

4 ответа

Проблема состоит в том, что Вы добавляете вещи к вектору, таким образом, он заканчивается с большим количеством элементов, чем были в эти myarr массив, с которым Вы инициализировали его.

, Если Вы хотите скопировать вектор назад в массив, необходимо будет измерить его вниз:

myvec.resize( MAX_SIZE);

Или Вы могли ограничить число элементов, которое Вы копируете назад:

copy( myvec.begin(), myvec.begin()+MAX_SIZE, myarr);

, Если Вы хотите эти myarr массив содержать все элементы, тогда это должно быть больше, чем MAX_SIZE, и Вы узнали, почему люди предлагают использовать vector, а не необработанные массивы (vector, с знают, как вырасти, массивы не делают).

Примечание, что, в то время как Вы не хотите 'Ответа, который напоминает: "Вы используете C++, отбрасываете реализацию массива стиля c. Использование только вектор для всей реализации массива"', можно часто сходить с рук использование vector и передача &myvec[0] к стандартным программам, которые ожидают необработанный массив. vector требуется, чтобы хранить его элементы непрерывно точно так же, как необработанный массив по просто этой причине.

, Так как Вы получаете 'небезопасную операцию' предупреждение, Вы используете компилятор Microsoft. Для решения проблемы безопасно Вы, как предполагается, используете checked_copy алгоритм вместо [1 111]. Как [1 115] Evgeny Lazin указывает , можно создать проверенный итератор для массива для передачи checked_copy алгоритм.

Другие опции сделать копию безопасной, которые не требуют, расширения Microsoft должны были бы обернуть массив в класс (возможно шаблонный), который отслеживает размер массива и предоставляет методы для копирования данных в массив безопасным способом. Что-то как [1 116] STLSoft's array_proxy шаблон или Повышение boost::array могло бы помочь.

18
ответ дан 1 December 2019 в 12:39
поделиться

В целом я предполагаю, что Вы могли сделать что-то вроде этого:

void *myarr;

if((myarr = malloc(myvec.size() * sizeof myvec[0])) != NULL)
{
  memcpy(myarr, &myvec[0], myvec.size() * sizeof myvec[0]);
  /* Do stuff with the C-style array for a while
   .
   .
   .
  */
  free(myarr);  /* Don't forget handing back the memory when done. */
}

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

, Конечно, это является общим, таким образом, это просто дает Вам void * для доступа к массиву C с, таким образом, необходимо или бросить или просто изменить тип на фактический тип (BYTE в этом случае).

3
ответ дан 1 December 2019 в 12:39
поделиться

Можно использовать вычет аргумента шаблона для нахождения массива связанным:

template<typename T, size_t N>
size_t copy(std::vector<T> const& src, T[N] dest) {
    size_t count = std::min(N, src.size());
    std::copy(src.begin(), src.begin()+count, dest);
    return count;
 }

Выключают предупреждения Microsoft о материале непроверенном. Они нацелены на соблазнение Вас в написание непортативного кода.

1
ответ дан 1 December 2019 в 12:39
поделиться

Можно сделать:

memcpy(myarr, &(myvec)[0], myvec.size())

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

0
ответ дан 1 December 2019 в 12:39
поделиться
Другие вопросы по тегам:

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