2017-02-15 15 views
1

std::fill(ForwardIt first, ForwardIt last, const T& value) позволяет мне заполнить часть вектора с постоянным значением.Частичное присвоение вектора другому

std::assign(InputIt first, InputIt last) позволяет мне полностью заменить вектор с частью другого вектора.

Есть ли функция в STL, которая объединяет эти два (smt like part_assign(begin, end, begin, end)), что позволяет мне заполнить интервал вектора другим вектором?

Если нет, то какой был бы наиболее эффективный способ сделать это?

+0

Откуда у вас этот 'std :: assign'? –

+0

@JonathanWakely, вероятно, он думает о ['std :: vector :: assign()'] (http://en.cppreference.com/w/cpp/container/vector/assign). –

ответ

7

Да, это называется std::copy:

std::copy(src_begin, src_end, dst_begin); 

Он копирует std::distance(src_begin, src_end) элементы (от исходного вектора) к элементам, начинающимся на dst_begin (в вашем векторе назначения). Как и в случае с fill, итератор назначения может быть вставкой, если вы хотите мутировать принимающий контейнер.

Существует несколько вариантов, например.

std::copy_n(src_begin, n, dst_begin); 

который копирует n элементы. Существует также std::move, который перемещает элементы, а не копирует их, или вы можете использовать итераторы перемещения с copy.

+0

Насколько я вижу, 'copy' вставляет элементы в вектор. Я ищу функцию, которая заменяет элементы в векторе, начиная с некоторого итератора, с помощью последовательности других элементов. –

+0

@ RobertHönig: Да, я понимаю. Вы ищете 'std :: copy'. –

+0

@ RobertHönig: [Demo] (http://ideone.com/iSoRdY). –

1

Существует три таких метода в шаблоне класса std::vector. Они

iterator insert(const_iterator position, size_type n, const T& x); 
template <class InputIterator> 
iterator insert(const_iterator position, InputIterator first, InputIterator last); 
iterator insert(const_iterator position, initializer_list<T> il); 

кажется, что наиболее подходящий метод для вашей задачи является

template <class InputIterator> 
iterator insert(const_iterator position, InputIterator first, InputIterator last); 

Вот показательная программа

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

int main() 
{ 
    std::vector<int> v1 = { 0, 1, 1, 0 }; 

    std::vector<int> v2 = { 1, 2, 3, 2, 1 }; 

    v1.insert(std::next(v1.begin(), 2), 
       std::next(v2.begin(), 1), 
       std::prev(v2.end(), 1)); 

    for (int x : v1) std::cout << x << ' '; 
    std::cout << std::endl; 
} 

Выход программы

0 1 2 3 2 1 0 
0

По крайней мере, как я понимаю й вопрос, вы просите что-то где (к примеру) я могу иметь входной вектор, как:

[1, 2, 3, 4, 5, 6]

, и я хочу, чтобы заменить шт. 3, 4, 5 с разными данными - скажем [7, 8, 9, 10, 11, 12], поэтому после операции результат должен быть: [1, 2, 7, 8, 9, 10, 11, 12, 6]. В частности, я предполагаю, что старый кусок и новый кусок не обязательно такой же длины.

Предполагая, что это правильно, короткое замыкание: «нет». Как и в, нет, ни std::vector, ни стандартные алгоритмы напрямую не поддерживают это.

Простой способ сделать это - использовать vector::erase для удаления исходных данных, а затем использовать vector::insert для вставки новых данных.

Для (возможно) повышения эффективности, вы начинаете с поиска более короткого из двух (старая часть или новая деталь). Затем вы скопируете эту длину данных из новых данных по старым данным. Затем, если новое было больше старого, вы должны вставить оставшуюся часть новых данных. В противном случае (новое было меньше старого) вы удалили оставшуюся часть старых данных.