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;
    
    }
  • 相关阅读:
    Bower 使用
    为什么是static?
    多重继承 -Javascript中的apply与call详解
    留用 未验证 js适配根字体大小
    Js作用域与作用域链详解
    理解AngularJS中的依赖注入
    渐进增强 优雅降级
    前后台数据交换的几种方式:
    then()方法是异步执行
    HTML怎么让img 等比例缩放
  • 原文地址:https://www.cnblogs.com/tianzeng/p/10404079.html
Copyright © 2011-2022 走看看