Вставка вектора в определенную позицию в другой вектор - PullRequest
3 голосов
/ 09 февраля 2020

Я хочу вставить вектор b в определенную позицию в векторе a. Например,

std::vector <int> vecta{ 10, 20, 30 ,40 , 50};
std::vector <int> vectb{ 1000, 2000, 3000 };

Как получить вектор результата, который будет иметь вид {10,20,1000,2000,3000,40,50}? Я хочу удалить 30 и заменить его вектором.

Ответы [ 3 ]

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

Я хочу вставить вектор b в определенную позицию в векторе a

Вы можете рассмотреть std::vector::insert():

vecta.insert(pos, vectb.begin(), vectb.end());

, где pos выше - это итератор, указывающий на элемент (в vecta) до , содержимое vectb будет вставлено. pos также может быть итератором, возвращаемым end(), что будет означать добавление содержимого vectb к vecta.


Как я могу иметь вектор результата, который будет иметь вид {10,20,1000,2000,3000,40,50}

. Для этого вам также необходимо удалить элемент 30 из vecta. Вы можете сделать это с помощью std::vector::erase():

auto main() -> int {
   std::vector <int> vecta{ 10, 20, 30, 40 , 50};
   /*                               ^
                                    |-- insert vectb here and replace the 30
   */

   std::vector <int> vectb{ 1000, 2000, 3000 };

   // what element to erase from vecta?
   auto pos = vecta.begin() + 2;

   // erase it
   pos = vecta.erase(pos);

   // insert vectb in vecta
   vecta.insert(pos, vectb.begin(), vectb.end());

   for (auto& e: vecta)
      std::cout << e << " ";
   std::cout << std::endl;
}

std::vector::erase() возвращает итератор, следующий за удаленным элементом. Поскольку вы хотите стереть 30 из vecta и затем вставить vectb в эту позицию, вы можете просто передать итератор erase(), возвращающийся к insert().

3 голосов
/ 09 февраля 2020

Вы можете использовать vector::insert

Живой образец

vecta.erase(vecta.begin() + 2); //<-- erase 30 element
vecta.insert(vecta.begin() + 2, vectb.begin(), vectb.end());

vecta.begin() + 2 являясь точкой вставки vectb в vecta и vectb.begin(), vectb.end() диапазона элементов vectb, вам необходимо вставить, в данном случае, все из них.

3 голосов
/ 09 февраля 2020

Вы можете использовать erase для удаления элемента в определенной позиции итератора и insert для вставки элементов перед определенной позицией итератора. Чтобы запустить итератор, используйте std::next и std::prev.

#include <iostream>
#include <iterator>
#include <vector>

int main() {
    std::vector<int> vecta{10, 20, 30, 40, 50};
    std::vector<int> vectb{1000, 2000, 3000};

    // erase 30 from the vector
    vecta.erase(std::next(vecta.begin(), 2));

    // insert vectb before position 2
    vecta.insert(std::next(vecta.begin(), 2), vectb.begin(), vectb.end());

    for(int v : vecta) {
        std::cout << v << ' ';
    }
    std::cout << '\n';
}

Выход:

10 20 1000 2000 3000 40 50

Альтернатива, которая не требует erase. Это, вероятно, немного быстрее:

#include <utility> // added for std::swap

int main() {
    std::vector<int> vecta{10, 20, 30, 40, 50};
    std::vector<int> vectb{1000, 2000, 3000};

    std::vector<int> result;

    // reserve space for the number of elements you know will be in the resulting vector
    result.reserve(vecta.size() - 1 + vectb.size());

    // append the 2 first elements from vecta
    result.insert(result.end(), vecta.begin(), std::next(vecta.begin(), 2));

    // append vectb
    result.insert(result.end(), vectb.begin(), vectb.end());

    // append the last two elements from vecta
    result.insert(result.end(), std::prev(vecta.end(), 2), vecta.end());

    // let vecta take over the data in result and vice-a-versa
    std::swap(result, vecta);
}
...