Конвертировать массив int в std :: vector - PullRequest
0 голосов
/ 20 февраля 2020

Я пытаюсь "преобразовать" целочисленный массив стиля C в std::vector<int*> без использования for l oop, или, скорее, вставить указатели всех элементов массива в вектор.

В настоящее время я реализую это, выполнив следующее:

for (size_t i = 0; i < 5; i++)
{
    vector.push_back(&values[i]);
}

Можно ли реализовать это с помощью std::vector::insert() и std::being/end?

Ответы [ 3 ]

5 голосов
/ 20 февраля 2020

std::transform - это полезный алгоритм в <algorithm> для копирования значений между контейнерами, которые неявно совместимы, но для которых вы можете предоставить функцию преобразования.

Вот пример того, как можно заполнить std::vector<int*> из std::array<int, N>

int values[5] = { 1,2,3,4,5 };
std::vector<int*> v1;

std::transform(
    std::begin(values), std::end(values),   // Copy from
    std::back_inserter(v1),                 // Copy to
    [](auto& i) {                           // Transformation function
        return &i;
    });

Редактировать: Изменено std::array<int, 5> на int[5] для учета правок в вопросе.

1 голос
/ 20 февраля 2020

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

template<class T, size_t ... Ints, size_t N>
std::vector<T*> makePtrsHelper(std::array<T,N>& arr, std::index_sequence<Ints...>) {
       return std::vector<T*>{ & std::get<Ints>(arr)... }; 
       // vector ctor taking pointers to array's elements
}

template<class T, size_t N>
std::vector<T*> makePtrs(std::array<T,N>& array) {
    return makePtrsHelper(array, std::make_index_sequence<N>{});
}

int main(){
    std::array<int,5> ar{1,2,3,4,5};
    std::vector<int*> v = makePtrs(ar);

Демонстрационная версия

0 голосов
/ 20 февраля 2020

Примечание : как указано в комментариях, мой ответ ниже ошибочно связан с vector<int>, а не vector<int*>, который был задан в вопросе.


Решение с std::copy и C массив стилей:

int ar[] = {1,2,3,4,3,2,1};
std::vector<int> vec;
std::copy(ar, ar+sizeof(ar)/sizeof(ar[0]), back_inserter(vec));
...