2017-11-18 113 views
1
std::remove_copy 

template <class InputIterator, class OutputIterator, class T> 
OutputIterator remove_copy (InputIterator first, InputIterator last, 
           OutputIterator result, const T& val); 

複製範圍去除價值,份數範圍 [第一,最後一個)的範圍內的元件的結果開始,除了那些比較等於VAL元件 。輸出容器必須足夠大以保持結果。STL的std :: remove_copy

q1。 爲什麼輸出容器的大小必須足夠大以保持結果?容器不會自行增長?

q2。 當我執行remove_copy時,爲什麼輸出容器中的前一個內容被覆蓋?即,當我執行一個remove_copy(a.begin(),a.end(),b.begin(),' ');容器b中的以前的內容丟失,它們被新內容替換爲什麼這樣?爲什麼remove_copy的結果不會附加在輸出容器的開頭?

+0

該函數設計用於使用STL容器類以及原始數組。 – user0042

+2

如果您希望容器增長,請使用['std :: back_inserter'](http://en.cppreference.com/w/cpp/iterator/back_inserter)。 –

回答

3

爲什麼輸出容器的大小必須足夠大以容納 結果?容器不會自行增長?

不是。怎麼可能?所有的算法都是迭代器,並且您無法從其迭代器訪問容器的成員函數(這是容器增長所需的)。但是,有專門的迭代器知道如何增長容器。 std::front_insert_iterator,std::back_insert_iteratorstd::insert_iterator,它們持有對容器的引用,並且只要它們被解除引用和分配,就分別調用push_front,push_backinsert

爲什麼當輸出容器中的前一個內容被覆蓋時,我 執行remove_copy?

因爲這就是算法的工作原理。這就是所有標準庫算法的工作原理。他們對容器一無所知。並非所有迭代器都來自容器。並不是所有的容器都可以生長。如果您想追加到容器中,則使用std::back_insert_iterator,如上所述。您可以使用std::back_inserter輔助函數來方便地創建一個,而無需指定模板參數。例如:

std::remove_copy(source.begin(), source.end(), std::back_inserter(dest), value); 
0

爲什麼輸出容器的尺寸必須足夠大,以保持 結果?容器不會自行增長?

算法運行於序列。容器是創建序列的一種方式,但它們不是唯一的方法。所以,是的,每當你訪問結束時,容器可以被寫入增長,但是序列通常不會這樣做。

如果您有容器,則可以使用std::inserter創建輸出迭代器,以根據需要展開容器。

爲什麼當輸出容器中的前一個內容被覆蓋時,我 執行remove_copy?

它可能是,也可能不是,取決於輸出迭代器的作用。如果它是一個容器(而不是insert_iterator)的迭代器,它只能訪問已存在的元素,所以它必須覆蓋它們。如果它是一個輸出流的迭代器,它只是將元素寫入流;沒有被覆蓋。

相關問題