Как получить массив C из std :: vector - PullRequest
0 голосов
/ 14 февраля 2019

Я новичок в C ++ 11, и меня смущает использование класса std::refence_wrapper.

Давайте рассмотрим пример, показанный в https://en.cppreference.com/w/cpp/utility/functional/reference_wrapper, в котором перетасовываются содержащиеся в нем элементыв стандартном std::vector, то есть:

std::vector<int> l(10); 
std::iota(l.begin(), l.end(), -4);
std::vector<std::reference_wrapper<int>> v(l.begin(), l.end());
std::shuffle(v.begin(), v.end(), std::mt19937{std::random_device{}()});

Теперь, если рассмотреть исходный вектор l, у меня есть l.data() возвращает указатель на внутренний массив, который я могу использовать в Cприложение.

Вместо этого мне не ясно, что возвращает v.data().Я пробовал различные комбинации явно неправильных приведений, таких как int* p = (int*)(v.data()->get()) без получения правильных результатов (поменявшиеся значения).

Моя цель - связать приложение C ++ (которое дает мне вектор справочных упаковщиков) со старой библиотекой C.Можете ли вы указать мне, какой самый правильный способ получить C-подобный массив из вектора v после случайного воспроизведения, показанного в примере?Нужно ли копировать все элементы один за другим в другом векторе?Есть ли класс C ++ 11, который может помочь мне в работе?Спасибо

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

После долгих размышлений я пришел к такому решению:

std::vector<int> l(10); 
std::iota(l.begin(), l.end(), -4);
std::vector<std::reference_wrapper<int>> v(l.begin(), l.end());
std::shuffle(v.begin(), v.end(), std::mt19937{std::random_device{}()});

std::vector<int> vec2 (v.begin(), v.end());
int* p = vec2.data();

Таким образом, я копирую элементы из v в новый вектор vec2.Массив C p, полученный из vec2, теперь действителен.

Интересно, есть ли лучший способ сделать работу ...

0 голосов
/ 14 февраля 2019

reference_wrapper - это тип C ++;вы не должны иметь возможность просто передать его в C API.Если вы хотите передать что-то в C API, то это должно быть то, что разделяют C и C ++.

Если этот C API принимает массив указателей на целые числа, то указатели на целые числа - это то, что ваши vector следует хранить.В противном случае да, вы должны скопировать эти целые числа во что-то, что C может говорить.

...