Скажите, что у меня есть функция:
void someFunc(int *x,int count);
который находится вне моего контроля, таким образом, я не могу записать это для принятия итераторов.
Это безопасный назвать его как так (независимо от определенной реализации STL):
vector<int> v;
/* ... */
someFunc(&v[0],v.size());
Очевидно, один встречный пример vector<bool>
. Как насчет какого-либо другого типа? (принятие я не специализировался vector
всегда).
Из раздела 23.2.4, пункт 1 стандарта:
[...] Элементы вектора хранятся непрерывно, это означает, что если v - вектор, где T - некоторый тип, отличный от bool, то он подчиняется тождеству & v [n] == & v [0] + n для всех 0 <= n
Так что да, это безопасно.
Примечание : если v
пусто, v [0]
является неопределенным поведением, поэтому вы должны делать это, только если v
не пусто.
Как уже говорили другие, это безопасно.
Но я хотел бы сделать небольшую оговорку. Если эта функция принимает массив и сохраняет его для последующего использования, у вас может возникнуть проблема. Это связано с тем, что std::vector может свободно деаллоцировать свою память, если ему понадобится изменить размер. Так что если эта функция просто использует массив (делает копию или что-то еще) или вы никогда не изменяете его, это безопасно.
Я просто хочу обратить внимание на то, что только потому, что элементы вектора хранятся смежно, это не означает, что они автоматически безопасны для передачи. Право собственности все еще остается проблемой.
Да. Предполагая, что v.size ()> 0
, это безопасно (если вектор пуст, то v [0]
приводит к неопределенному поведению).
Элементы контейнера std :: vector
хранятся непрерывно, как в обычном массиве.