Действительно ли безопасно передать вектор как массив?

Скажите, что у меня есть функция:

void someFunc(int *x,int count);

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

Это безопасный назвать его как так (независимо от определенной реализации STL):

vector<int> v;
/* ... */
someFunc(&v[0],v.size());

Очевидно, один встречный пример vector<bool>. Как насчет какого-либо другого типа? (принятие я не специализировался vector всегда).

17
задан uj2 22 June 2010 в 13:19
поделиться

3 ответа

Из раздела 23.2.4, пункт 1 стандарта:

[...] Элементы вектора хранятся непрерывно, это означает, что если v - вектор, где T - некоторый тип, отличный от bool, то он подчиняется тождеству & v [n] == & v [0] + n для всех 0 <= n

Так что да, это безопасно.

Примечание : если v пусто, v [0] является неопределенным поведением, поэтому вы должны делать это, только если v не пусто.

31
ответ дан 30 November 2019 в 10:45
поделиться

Как уже говорили другие, это безопасно.

Но я хотел бы сделать небольшую оговорку. Если эта функция принимает массив и сохраняет его для последующего использования, у вас может возникнуть проблема. Это связано с тем, что std::vector может свободно деаллоцировать свою память, если ему понадобится изменить размер. Так что если эта функция просто использует массив (делает копию или что-то еще) или вы никогда не изменяете его, это безопасно.

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

9
ответ дан 30 November 2019 в 10:45
поделиться

Да. Предполагая, что v.size ()> 0 , это безопасно (если вектор пуст, то v [0] приводит к неопределенному поведению).

Элементы контейнера std :: vector хранятся непрерывно, как в обычном массиве.

9
ответ дан 30 November 2019 в 10:45
поделиться
Другие вопросы по тегам:

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