Как вставить вектор в другой вектор в указанном c месте, чтобы я получил большой вектор обоих, и это место будет перезаписано? - PullRequest
1 голос
/ 17 апреля 2020

для упражнения мне действительно нужно знать, как вставить один вектор в другой.

вот пример того, что мне нужно:

//let's say i have these 2 vecs: 
vec1 = { 18, 192, 34};
vec2 = { 171, 11, 50, 6};

и я выбираю точку, где соедините их, скажем, я выбрал ve c 1 вместо 2 вектора 2 следующим образом:

result_vec = { 171, vec1, 50, 6};

так что я действительно получу, когда я закончу:

result_vec = { 171, 18, 192, 34, 50, 6};

для меня будет еще лучше увидеть два примера, простой пример и еще один пример с такими умными указателями, как shared_ptr или unique_ptr.

Спасибо!

Ответы [ 2 ]

3 голосов
/ 17 апреля 2020

Иногда это помогает просмотреть некоторые ссылки и посмотреть на методы, которые предлагает контейнер. Большую часть времени вы обнаружите, что есть метод, который делает то, что вы хотите из коробки. В этом случае это std::vector::insert (перегрузка (4)). Чтобы удалить старый элемент в этом месте, вы можете использовать std::vector::erase:

#include <iostream>
#include <vector>

int main() {
    std::vector<int> vec1{ 18, 192, 34};
    std::vector<int> vec2{ 171, 11, 50, 6};
    vec1.insert(vec1.begin()+1,vec2.begin(),vec2.end());
    vec1.erase(vec1.begin()+1);
    for (int e : vec1) std::cout << e << ' ';
}

Вывод:

18 11 50 6 192 34 

Я вставил наоборот, но это должно быть легко отрегулировать. То же самое для интеллектуальных указателей не требует использования другого алгоритма / метода. Если вы хотите сохранить исходный вектор, вам нужно только сделать копию перед вставкой.

PS: Я сначала неправильно прочитал вопрос и пропустил часть удаления элемента в месте, где вы вставляете. Мое фиксированное решение не самое эффективное, потому что вставка и стирание старого элемента может быть сделано за один go. Однако для не слишком больших векторов разница в эффективности может быть незначительной.

2 голосов
/ 17 апреля 2020

Кажется, вы хотите заменить один элемент одного вектора элементами другого вектора. Если это так, то вы можете написать функцию, аналогичную показанной в демонстрационной программе.

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

template <typename T>
std::vector<T> & replace( std::vector<T> &v1, 
                          typename std::vector<T>::size_type pos,
                          const std::vector<T> &v2 )
{
    if ( not ( pos < v1.size() ) )
    {
        v1.insert( std::end( v1 ), std::begin( v2 ), std::end( v2 ) );
    }
    else
    {
        v1.insert( v1.erase( std::next( v1.begin(), pos ) ),
                   std::begin( v2 ), std::end( v2 ) );
    }

    return v1;
}                          

int main() 
{
    std::vector<int> v1 = { 171, 11, 50, 6 };
    std::vector<int> v2 = { 18, 192, 34 };

    for ( const auto &item : replace( v1, 1, v2 ) ) std::cout << item << ' ';
    std::cout << '\n';

    return 0;
}

Вывод программы:

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