Подтвердить что ты не робот

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

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

void someFunc(int *x,int count);

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

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

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

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

4b9b3361

Ответ 1

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

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

Итак, это безопасно.

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

Ответ 2

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

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

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

Ответ 3

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

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