Функция требует в качестве параметра указатель на массив const int*. Требуется передать вектор v<int>.
Эквивалентны ли следующие передачи:
&v[0] и v.begin() ?
Функция требует в качестве параметра указатель на массив const int*. Требуется передать вектор v<int>.
Эквивалентны ли следующие передачи:
&v[0] и v.begin() ?
v.begin() возвращает итератор, это не const int*.
&*v.begin(), &v[0] и v.data() - эквивалентны.
Использование v.data() предпочтительнее, т.к. оно лучше передает намерение.
implementation-defined, так что формально он может быть и обычным указателем.
– αλεχολυτ
Mar 31 '16 at 11:23
std::basic_string &v[0] можно вызывать и на пустом контейнере. Главное, не писать туда.
– αλεχολυτ
Mar 31 '16 at 11:25
begin() говорится, что возвращает итератор на первый элемент, но первого элемента в пустой строке нет. Мне кажется, хотя это явно и не написано, подобное поведение не разрешено, хотя и будет работать почти везде, за счёт SSO.
– ixSci
Mar 31 '16 at 11:32
< и не прочитал окончание предложения.
– ixSci
Mar 31 '16 at 11:56
Нет, не эквивалентны, т.к. v.begin() возвращает итератор (т.е. std::vector<int>::iterator) на первый элемент vector<int>, а &v[0] указатель на адрес в памяти, где расположен элемент из vector'а (т.е. int*).
Соответственно, интерфейс работы с такими типами различен, но, опять же, никто не запрещает разыменовать итератор (но предварительно следует проверить не указывает ли итератор на на v.end()), а затем взять адрес полученного элемента.
А так как vector эмулирует работу стандартного массива C (например, быстрый произвольный доступ к элементам), то все элементы в нем располагаются общим скопом (т.е. располагаются подряд в памяти), поэтому вам подойдет способ передачи &v[0], а перемещение по элементам массива через operator ++ примененный к параметру функции, например.
Но в таком случае вам стоит заранее обдумать каким именно образом вы будете учитывать границы массива:
Пример реализации посредством 1-го пункта:
#include <vector>
void func(const int* parm, const int elemsCount)
{
for (int itemNumber = 0; itemNumber < elemsCount; ++itemNumber, ++parm)
{
// ToDo: дейтсвия с *parm
}
}
int main()
{
std::vector<int> v = {1, 2, 3, 4, 5};
func(&v[0], v.size());
}
cнапример. Или уже имеется рабочий интерфейс. Аstd::vectorдовольно легко можно подружить с нативным указателем там где надо. – αλεχολυτ Mar 31 '16 at 11:46натягиванием совыконвертацией типов данных не будет. – VladD Mar 31 '16 at 11:50const int*. Вы не можете переписать эту функцию, или что-либо вообще в этой библиотеке. – αλεχολυτ Mar 31 '16 at 11:55dll/so/lib+*.h. Разумеется без самих исходников. – αλεχολυτ Mar 31 '16 at 12:33