日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++ remove、remove_copy、remove_if和remove_copy_if函数使用详解

發布時間:2024/4/18 c/c++ 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++ remove、remove_copy、remove_if和remove_copy_if函数使用详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

如果不知道具體的場景,即元素保存在什么樣的容器中,是不能從序列中移除元素的。因此,“移除元素的”算法也無法做到這一點,它們只會重寫被選擇的元素或者忽略復制的元素。移除操作不會改變被“移除”元素的序列的元素個數。

有 4 種移除算法:

  • remove() 可以從它的前兩個正向迭代器參數指定的序列中移除和第三個參數相等的對象。基本上每個元素都是通過用它后面的元素覆蓋它來實現移除的。它會返回一個指向新的最后一個元素之后的位置的迭代器。
  • remove_copy() 可以將前兩個正向迭代器參數指定的序列中的元素復制到第三個參數指定的目的序列中,并忽略和第 4 個參數相等的元素。它返回一個指向最后一個被復制到目的序列的元素的后一個位置的迭代器。序列不能是重疊的。
  • remove_if() 可以從前兩個正向迭代器指定的序列中移除能夠使作為第三個參數的謂詞返回 true 的元素。
  • remove_copy_if() 可以將前兩個正向迭代器參數指定的序列中,能夠使作為第 4 個參數的謂詞返回 true 的元素,復制到第三個參數指定的目的序列中。它返回一個指向最后一個被復制到目的序列的元素的后一個位置的迭代器。序列不能是重疊的。


可以按如下方式使用 remove():

? std::deque<double> samples {1.5, 2.6, 0.0, 3.1, 0.0, 0.0, 4.1, 0.0, 6.7, 0.0}; samples.erase(std::remove(std::begin(samples), std::end(samples), 0.0), std::end(samples)); std::copy(std::begin(samples),std::end(samples), std::ostream iterator <double> {std::cout," "}); std::cout << std::endl; // 1.5 2.6 3.1 4.1 6.7

sample 中不應包含為 0 的物理測量值。remove() 算法會通過左移其他元素來覆蓋它們,通過這種方式就可以消除雜亂分布的 0。remove() 返回的迭代器指向通過這個操作得到的新序列的尾部,所以可以用它作為被刪除序列的開始迭代器來調用 samples 的成員函數 erase()。注釋說明容器中的元素沒有被改變。

如果想保留原始序列,并生成一個移除選定元素之后的副本,可以使用 remove_copy()。 例如:

?
  • std::deque<double> samples {1.5, 2.6, 0.0, 3.1, 0.0, 0.0, 4.1, 0.0, 6.7, 0.0}; std::vector<double> edited_samples;
  • std::remove_copy(std::begin(samples), std::end(samples), std::back_inserter(edited_samples), 0.0);
  • samples 容器中的非零元素會被復制到 edited_samples 容器中,edited_samples 正好是一個 vector 容器。通過 back_insert_iterator 對象將這些元素添加到 edited_samples,因此這個容器只包含從 sample 中復制的元素。

    remove_if() 提供了更強大的能力,它能夠從序列中移除和給定值匹配的元素。謂詞會決定一個元素是否被移除;它接受序列中的一個元素為參數,并返回一個布爾值。例如:

    ? using Name = std::pair<string, string>; // First and second name std::set<Name> blacklist {Name {"Al", "Bedo"}, Name {"Ann", "Ounce"}, Name {"Jo","King"}}; std::deque<Name> candidates {Name{"Stan", "Down"}, Name {"Al", "Bedo"}, Name {"Dan", "Druff"},Name {"Di", "Gress"}, Name {"Ann", "Ounce"}, Name {"Bea", "Gone"}}; candidates.erase(std::remove_if(std::begin(candidates), std::end(candidates),[&blacklist](const Name& name) { return blacklist.count(name); }), std::end(candidates)); std::for_each(std::begin(candidates), std::end(candidates), [] (const Name& name){std::cout << '"' << name.first << " " << name.second << "\" ";}); std::cout << std::endl; // "Stan Down" "Dan Druff" "Di Gress" "Bea Gone"

    這段代碼用來模擬候選人申請成為倶樂部會員。那些眾所周知的不安分人士的姓名被保存在 blacklist 中,它是一個集合。當前申請成為會員的候選人被保存在 candidates 容器中,它是一個 deque 容器。用 remove_if() 算法來保證不會有 blacklist 中的姓名通過甄選過程。這里的謂詞是一個以引用的方式捕獲 blacklist 容器的 lambda 表達式。當參數在容器中存在時,set 容器的成員函數 count() 會返回 1。謂詞返回的值會被隱式轉換為布爾值,因此對于每一個出現在 blacklist 中的候選人,謂詞都會返回 true,然后會將它們從 candidates 中移除。注釋中顯示了通過甄選的候選人。

    remove_copy_if() 之于 remove_copy(),就像 remove_if() 之于 remove。下面展示它是如何工作的:

    ? std::set<Name> blacklist {Name {"Al", "Bedo"}, Name {"Ann", "Ounce"}, Name {"Jo", ,"King" } }; std::deque<Name> candidates {Name {"Stan", "Down"}, Name { "Al", "Bedo"},Name {"Dan", "Druff"}, Name {"Di", "Gress"}, Name {"Ann", "Ounce"},Name {"Bea", "Gone"}}; std::deque<Name> validated; std::remove_copy_if(std::begin(candidates) , std::end(candidates), std::back inserter(validated), [&blacklist] (const Name& name) { return blacklist.count(name); });

    這段代碼實現了和前一段代碼同樣的功能,除了結果被保存在 validated 容器中和沒有修改 candidates 容器之外。

    < C++ swap_ranges C++ fill和fill_n >

    與50位技術專家面對面20年技術見證,附贈技術全景圖

    總結

    以上是生活随笔為你收集整理的C++ remove、remove_copy、remove_if和remove_copy_if函数使用详解的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。