передача std :: vector в функцию, которая модифицирует входной массив - PullRequest
6 голосов
/ 02 апреля 2011

Я использую сторонний API ( CryptEncrypt , если быть точным), который принимает массив C в качестве параметра in-out.Логически API сводится к следующей функции:

void add1(int *inout, size_t length)
{
  for(size_t i = 0; i < length; i++)
  {
    inout[i] += 1;
  }
}

Я пытаюсь избежать использования необработанных массивов, поэтому мой вопрос заключается в том, могу ли я использовать std :: vector в качестве входных данных для APIвыше?Примерно так:

#include <vector>
int main()
{
  std::vector<int> v(10); // vector with 10 zeros
  add1(&v[0], v.size());  // vector with 10 ones?
}

Могу ли я использовать гарантию «непрерывного хранения» вектора для записи данных в него?Я склонен полагать, что это нормально (это работает с моим компилятором), но я чувствовал бы себя намного лучше, если бы кто-то более знающий, чем я, мог подтвердить, если такое использование не нарушает гарантии стандарта C ++.:)

Заранее спасибо!

Ответы [ 4 ]

6 голосов
/ 02 апреля 2011

Могу ли я использовать гарантию «непрерывного хранения» вектора для записи данных в него?

Да.

Я склонен полагать, что это нормально

Ваш наклон правильный.

3 голосов
/ 02 апреля 2011

Поскольку гарантируется, что хранилище является смежным (начиная с версии 2003 стандарта и даже до того, как практически невозможно было реализовать разумно vector без использования массива под капотом), все должно быть в порядке.

2 голосов
/ 02 апреля 2011

Стандарт гарантирует, что хранение будет непрерывным, но доступ к элементу [0] в пустом векторе является неопределенным поведением по стандарту.Таким образом, вы можете получить ошибку в некоторых компиляторах.(См. Другой пост, в котором эта проблема с Visual Studio 2010 приведена в SO. )

Стандарт разрешил эту проблему в C ++ 0x, хотя.

0 голосов
/ 02 апреля 2011

Это должно работать. Я не вижу никаких проблем.

...