2017-02-15 172 views
1

std::fill(ForwardIt first, ForwardIt last, const T& value)允許我填充矢量的一部分與一恆定值。部分分配矢量到另一個

std::assign(InputIt first, InputIt last)讓我完全與其他載體的一部分替換矢量

在STL中是否有一個函數結合了這兩個函數(像part_assign(begin, end, begin, end)這樣的smtt),允許我用另一個向量填充一個向量的間隔?

如果不是這樣,這將是這樣做的最有效方法是什麼?

+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插入新數據。

對於(可能)提高的效率,您首先找到兩個中的較短者(舊件或新件)。然後,您需要從舊數據中複製新數據的這段數據。然後,如果新的數據大於舊的數據,則會插入新數據的其餘部分。否則(新的比舊的小)你會刪除剩餘的舊數據。