Безопасно ли передавать вектор в виде массива? - PullRequest
17 голосов
/ 22 июня 2010

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

void someFunc(int *x,int count);

, которая находится вне моего контроля, поэтому я не могу написать ее для принятия итераторов.(независимо от конкретной реализации STL):

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

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

Ответы [ 3 ]

31 голосов
/ 22 июня 2010

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

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

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

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

9 голосов
/ 22 июня 2010

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

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

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

9 голосов
/ 22 июня 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...