C++ remove、remove_copy、remove_if和remove_copy_if函数使用详解
如果不知道具體的場景,即元素保存在什么樣的容器中,是不能從序列中移除元素的。因此,“移除元素的”算法也無法做到這一點,它們只會重寫被選擇的元素或者忽略復制的元素。移除操作不會改變被“移除”元素的序列的元素個數(shù)。
有 4 種移除算法:
- remove() 可以從它的前兩個正向迭代器參數(shù)指定的序列中移除和第三個參數(shù)相等的對象。基本上每個元素都是通過用它后面的元素覆蓋它來實現(xiàn)移除的。它會返回一個指向新的最后一個元素之后的位置的迭代器。
- remove_copy() 可以將前兩個正向迭代器參數(shù)指定的序列中的元素復制到第三個參數(shù)指定的目的序列中,并忽略和第 4 個參數(shù)相等的元素。它返回一個指向最后一個被復制到目的序列的元素的后一個位置的迭代器。序列不能是重疊的。
- remove_if() 可以從前兩個正向迭代器指定的序列中移除能夠使作為第三個參數(shù)的謂詞返回 true 的元素。
- remove_copy_if() 可以將前兩個正向迭代器參數(shù)指定的序列中,能夠使作為第 4 個參數(shù)的謂詞返回 true 的元素,復制到第三個參數(shù)指定的目的序列中。它返回一個指向最后一個被復制到目的序列的元素的后一個位置的迭代器。序列不能是重疊的。
可以按如下方式使用 remove():
sample 中不應包含為 0 的物理測量值。remove() 算法會通過左移其他元素來覆蓋它們,通過這種方式就可以消除雜亂分布的 0。remove() 返回的迭代器指向通過這個操作得到的新序列的尾部,所以可以用它作為被刪除序列的開始迭代器來調用 samples 的成員函數(shù) erase()。注釋說明容器中的元素沒有被改變。
如果想保留原始序列,并生成一個移除選定元素之后的副本,可以使用 remove_copy()。 例如:
samples 容器中的非零元素會被復制到 edited_samples 容器中,edited_samples 正好是一個 vector 容器。通過 back_insert_iterator 對象將這些元素添加到 edited_samples,因此這個容器只包含從 sample 中復制的元素。
remove_if() 提供了更強大的能力,它能夠從序列中移除和給定值匹配的元素。謂詞會決定一個元素是否被移除;它接受序列中的一個元素為參數(shù),并返回一個布爾值。例如:
這段代碼用來模擬候選人申請成為倶樂部會員。那些眾所周知的不安分人士的姓名被保存在 blacklist 中,它是一個集合。當前申請成為會員的候選人被保存在 candidates 容器中,它是一個 deque 容器。用 remove_if() 算法來保證不會有 blacklist 中的姓名通過甄選過程。這里的謂詞是一個以引用的方式捕獲 blacklist 容器的 lambda 表達式。當參數(shù)在容器中存在時,set 容器的成員函數(shù) count() 會返回 1。謂詞返回的值會被隱式轉換為布爾值,因此對于每一個出現(xiàn)在 blacklist 中的候選人,謂詞都會返回 true,然后會將它們從 candidates 中移除。注釋中顯示了通過甄選的候選人。
remove_copy_if() 之于 remove_copy(),就像 remove_if() 之于 remove。下面展示它是如何工作的:
這段代碼實現(xiàn)了和前一段代碼同樣的功能,除了結果被保存在 validated 容器中和沒有修改 candidates 容器之外。
< C++ swap_ranges C++ fill和fill_n >
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的C++ remove、remove_copy、remove_if和remove_copy_if函数使用详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何学习计算机网络
- 下一篇: python3 测试函数的一个例子