Безопасно ли передавать вектор в виде массива?
Скажем, у меня есть функция:
void someFunc(int *x,int count);
который вышел из-под контроля, поэтому я не могу записать его для приема итераторов.
Безопасно ли вызывать его так (независимо от конкретной реализации STL):
vector<int> v;
/* ... */
someFunc(&v[0],v.size());
Очевидно, что один пример счетчика vector<bool>
. Как насчет любого другого типа? (предполагая, что у меня нет специализированного vector
).
Ответы
Ответ 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
хранятся смежно, как в обычном массиве.