zoukankan      html  css  js  c++  java
  • 移除元素(remove,remove_if...unique...)

    remove

      因为本算法作用的是iterator,所以并不会改变Container大小,会返回一个新的iterator new_last,是的first到new_last中的元素都不等于value,左端元素的相对位置不变

    template <class ForwardIterator,class T>
    ForwardIterator remove(ForwardIterator first,ForwardIterator last,const T& value);

    remove_if

      移除pred(*i)为true的元素

    template <class ForwardIterator,class Predicate>
    ForwardIterator remove_if(ForwardIterator first,ForwardIterator last,Predicate pred);

    remove_copy

      不会复制值与value相等元素,返回值是result的尾端,被复制的元素的相对位置不改变

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

    remove_copy_if

    template <class ForwardIterator,class OutputIterator,class Predicate>
    ForwardIterator remove_copy_if(ForwardIterator first,ForwardIterator last,OutputIterator result,Predicate pred);

    unique

      元素去重。即”删除”序列中所有相邻的重复元素(只保留一个)。并不是真的删除,而是指重复元素的位置被不重复的元素给占领。把不重复的元素移到前面来,未被移除的元素的相对位置不改变。

      返回值是一个迭代器,它指向的是去重后容器中不重复序列的最后一个元素的下一个元素

    //版本一:重载operator==,如果*i==*(i-1)则有重复的元素 
    template <class ForwardIterator>
    ForwardIterator unique(ForwardIterator fisrt,ForwardIterator last);
    
    //版本二:自定义函数对象cmp(*i,*(i-1))为true,有重复
    template <class ForwardIterator,class BinaryPredicate>
    ForwardIterator unique(ForwardIterator fisrt,ForwardIterator last,BinaryPredicate cmp); 

    unique_copy

    //版本一:重载operator==,如果*i==*(i-1)则有重复的元素 
    template <class InputIterator,class OutputIterator>
    OutputIterator unique_copy(ForwardIterator fisrt,ForwardIterator last,OutputIterator result);
    
    //版本二:自定义函数对象cmp(*i,*(i-1))为true,有重复
    template <class ForwardIterator,class OutputIterator,class BinaryPredicate>
    OutputIterator unique_copy(ForwardIterator fisrt,ForwardIterator last,OutputIterator result,BinaryPredicate cmp); 
    #include <iostream>
    #include <vector>
    #include <algorithm>
    #include <string.h>
    #include <iterator>
    using namespace std;
    
    class F
    {
        public:
            bool operator()(int i)
            {
                return i&1==1;
            }    
    };
    class F1
    {
        public:
            F1(string t):s1(t){}
            bool operator()(string s)
            {
                return !strcmp(s.c_str(),s1.c_str());
            }
        private:
            string s1;
    };
    int main()
    {
        vector<int> v{1,2,3,4,5,6};
        //auto it=remove_if(v.begin(),v.end(),F());
        //cout<<*--it<<endl;
        //v.erase(remove_if(v.begin(),v.end(),F()),v.end());
        
        vector<string> vs{"hello"," ","word!","how"," ","you","."};
        remove_copy_if(vs.begin(),vs.end(),ostream_iterator<string>(cout," "),F1("you"));
        /*for(auto i:vs)
            cout<<i<<' ';
        cout<<endl;*/
        return 0;
    }
    #include <iostream>
    #include <vector>
    #include <algorithm>
    using namespace std;
    
    class F
    {
        public:
            F(vector<int> t):_v(t){}
            bool operator()(int i,int j)
            {
                if(count(_v.begin(),_v.end(),i)!=1)
                    return true;
                else
                    return false;
            }
        private:
            vector<int> _v;
    };
    int main()
    {
        //用sort,unique函数去除相邻重复的元素 
        vector<int> arr{1,2,3,4,5,6,5,6};
        sort(arr.begin(),arr.end(),greater<int>());
        arr.erase(unique(arr.begin(),arr.end()),arr.end());//unique返回new_last,其中不包含重复的元素 
        for_each(arr.begin(),arr.end(),[](int i)
        {
            cout<<i<<' ';
        });
        cout<<endl;
        
        vector<int> arr1{1,2,3,4,4,5,6,5,6};
        arr1.erase(unique(arr1.begin(),arr1.end(),F(arr1)),arr1.end());
        for_each(begin(arr1),end(arr1),[](int i)
        {
            cout<<i<<' ';
        });
        cout<<endl;
        return 0;
    
    }
  • 相关阅读:
    笔记:C/C++字符函数的使用
    学习游戏基础编程3:地图编辑器
    学习游戏基础编程2:Win32分割窗口
    学习游戏基础编程1:Win32自定义控件
    [WebServer] Tomcat 配置访问限制:访问白名单和访问黑名单
    [WebServer] Windows操作系统下 Tomcat 服务器运行 PHP 的环境配置
    XSLT函数集合:数值函数、字符串函、节点集函数和布尔函数
    腾讯的一道JavaScript面试题
    【转】AES 进一步的研究
    MQTT-Client-FrameWork使用整理
  • 原文地址:https://www.cnblogs.com/tianzeng/p/10404079.html
Copyright © 2011-2022 走看看