C++算法库(2)


/*copy 将一个范围中的元素拷贝到新的位置处*/
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;


int main(int argc, const char * argv[])
{
    
    int myints[] = {10,20,30,40,50,60,70};
    
    
    vector<int> myvector(7);
    copy(myints, myints + 7, myvector.begin());
    
    vector<int>::iterator it = myvector.begin();
    
    cout<<"myvector contains:";
    for (it = myvector.begin(); it != myvector.end(); ++it)
        cout<<' '<<*it;
    cout<<endl;
    
    
        return 0;
}

/*copy_backward 将一个范围中的元素按逆序拷贝到新的位置处*/
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;


int main(int argc, const char * argv[])
{
    vector<int> myvector;
    
    for (int i =1; i <= 5; i++)
        myvector.push_back(i * 10);
    
    myvector.resize(myvector.size());
    
    copy_backward(myvector.begin(), myvector.begin() + 5, myvector.end());
    cout<<"myvector contains:";
    vector<int>::iterator it ;
    
    for (it= myvector.begin(); it != myvector.end(); ++it)
        cout<<' '<<*it;
    cout<<endl;
    
    
        return 0;
}


/*copy_if   将一个范围中满足给定条件的元素拷贝到新的位置处*/
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main(int argc, const char * argv[])
{
    vector<int> foo = {25,15,5,-5,-15};
    vector<int> bar (foo.size());
    auto it = copy_if(foo.begin(), foo.end(), bar.begin(), [](int i){return (i>0);});
    bar.resize(distance(bar.begin(), it));
    
    cout<<"bar contains:";
    for (int& x: bar)
        cout<<' '<<x;
    cout<<endl;
        
        return 0;
}

/*fill   将一个范围的元素赋值为给定值*/
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int main(int argc, const char * argv[])
{
    vector<int> myvector(8);
    vector<int>::iterator it;
    
    fill(myvector.begin(), myvector.begin() + 2, 5);
    fill(myvector.begin() + 2, myvector.end() - 1, 8);
    
    cout<<"myvector contains:";
    
    for (it = myvector.begin(); it!= myvector.end(); ++it)
        cout<<" "<<*it;
    cout<<endl;
    
        return 0;
}


/*fill_n   将某个位置开始的 n 个元素赋值为给定值*/
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int main(int argc, const char * argv[])
{
    vector<int> myvector(8,10);
    fill_n(myvector.begin(), 4, 20);
    fill_n(myvector.begin() + 3, 3, 33);
    cout<<"myvectors contains:";
    
    
        return 0;
}

/*generate   将一个函数的执行结果保存到指定范围的元素中,用于批量赋值范围中的元素*/
#include <iostream>
#include <algorithm>
#include <vector>
#include <ctime>
#include <cstdlib>

using namespace std;
int RandomNumber(){return (rand() % 100);}

struct c_unique {
    int current;
    c_unique(){current = 0;};
    int operator()(){return ++current;}
    
}UniqueNumber;

int main(int argc, const char * argv[])
{
    srand(unsigned(time(0)));
    vector<int> myvector(8);
    vector<int>::iterator it;
    
    generate(myvector.begin(), myvector.end(), RandomNumber);
    cout<<"myvector contains:";
    for (it = myvector.begin(); it != myvector.end(); ++it)
        cout<<" " <<*it;
    cout<<endl;
    
    
    generate(myvector.begin(), myvector.end(), UniqueNumber);
    cout<<"myvector contains:";
    for (it = myvector.begin(); it != myvector.end(); ++it)
        cout<< " " <<*it;
    cout<<endl;
    
    
        return 0;
}


/*generate_n   将一个函数的执行结果保存到指定位置开始的 n 个元素中*/
#include <iostream>
#include <algorithm>
#include <vector>
#include <ctime>
#include <cstdlib>

using namespace std;

int current = 0;
int UniqueNumber(){return ++current;}



int main(int argc, const char * argv[])
{
    int myarray[9];
    generate_n(myarray, 9, UniqueNumber);
    cout<<"myarray contains:";
    for (int i =0 ; i < 9; ++i)
        cout<<" " << myarray[i];
    cout<<endl;
    
    
    
        return 0;
}

/*iter_swap   交换两个迭代器指向的元素*/
#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

int main(int argc, const char * argv[])
{
    int myints[] = {50,20,30,40,50};
    vector<int> myvector(4,9);
    vector<int>::iterator it;
    
    iter_swap(myints, myvector.begin());
    iter_swap(myints + 3, myvector.begin() + 2);
    cout<<"myvector contains:";
    for (it = myvector.begin(); it != myvector.end(); ++it)
        cout<<" "<<*it;
    cout<<endl;
    
        return 0;
}


/*move   将一个范围中的元素移动到新的位置处*/
#include <iostream>
#include <algorithm>
#include <utility>
#include <vector>
#include <string>


using namespace std;

int main(int argc, const char * argv[])
{
    vector<string> foo = {"air","water","fire","earth"};
    vector<string> bar(4);
    
    //moving ranges:
    cout<<"Moving ranges...";
    move(foo.begin(), foo.begin() + 4, bar.begin());
    cout<<"foo contains "<<foo.size()<<" elements:";
    cout<<"(each in an unspecified but valid state)"<<endl;
    
    cout<<"bar contains "<<bar.size()<<" elements:";
    for (string& x:bar)
        cout<< "["<<x<<"]";
    cout<<endl;
    
    //moving container
    cout<<"Moving container...\n";
    foo = move(bar);
    
    cout<<"foo contains "<<foo.size()<<" elements:";
    for (string& x:foo)
        cout<<"["<<x<<"]";
    cout<<endl;
    
    
        return 0;
}

/*move_backward   将一个范围中的元素按逆序移动到新的位置处*/
#include <iostream>
#include <algorithm>
#include <utility>
#include <vector>
#include <string>


using namespace std;

int main(int argc, const char * argv[])
{
    string elems[10] = {"air","water","fire","earth"};
    move_backward(elems, elems + 4, elems + 5);
    elems[0] = "ether";
    
    cout<<"elems contains:";

    for (int i =0; i < 10; ++i)
        cout<<"["<<elems[i]<<"]";
    cout<<endl;
        
        return 0;
}

/*random_shuffle   随机打乱指定范围中的元素的位置*/
#include <iostream>
#include <algorithm>
#include <vector>
#include <ctime>
#include <cstdlib>
using namespace std;
int myrandom (int i) {return rand() % i;}

int main(int argc, const char * argv[])
{

    srand(unsigned(time(0)));
    vector<int> myvector;
    vector<int>::iterator it;
    
    //set some values:
    for (int i = 1; i < 10; ++i)
        myvector.push_back(i);
    
    //using built-in random generator:
    random_shuffle(myvector.begin(), myvector.end());
    
    //using myrandom :
    random_shuffle(myvector.begin(), myvector.end(),myrandom);
    
    //print out content:
    cout<<"myvector contains:";
    for (it = myvector.begin(); it != myvector.end(); ++it)
        cout<<" " <<*it;
    cout<<endl;
    
    
        return 0;
}

/*remove   将一个范围中值等价于给定值的元素删除*/
#include <iostream>
#include <algorithm>

using namespace std;

int main(int argc, const char * argv[])
{
    int myints[] = {10,20,30,30,20,10,10,20};
    
    int* pbegin = myints;
    int* pend = myints + sizeof(myints) / sizeof(int);
    
    pend = remove(pbegin, pend, 10);
    cout<<"range contains:";
    for (int* p = pbegin; p != pend; ++p)
        cout<<" "<<*p;
        
    cout<<endl;
    return 0;
}

输出结果:

range contains: 20 30 30 20 20

/*remove_if   将一个范围中值满足给定条件的元素删除*/
#include <iostream>
#include <algorithm>

using namespace std;

bool IsOdd(int i){return ((i % 2) == 0);}


int main(int argc, const char * argv[])
{
    int myints[] = {1,2,3,4,5,6,7,8,9};
    
    //bounds of range:
    int* pbegin = myints;
    int* pend = myints + sizeof(myints) / sizeof(int);
    
    pend = remove_if(pbegin, pend, IsOdd);
    
    cout<<"the range contains:";
    for (int* p = pbegin; p != pend; ++p)
        cout<<" "<<*p;
    cout<<endl;
        
        
    return 0;
}

输出结果:

the range contains: 1 3 5 7 9

/*remove_copy   拷贝一个范围的元素,将其中值等价于给定值的元素删除*/
#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

int main(int argc, const char * argv[])
{

    int myints[] = {10,20,30,30,20,10,10,20};
    vector<int> myvector(8);
    vector<int>::iterator it;
    remove_copy(myints, myints + 8, myvector.begin(), 20);
    cout<<"myvector contains:";
    for (it = myvector.begin(); it != myvector.end(); ++it)
        cout<<" "<<*it;
    cout<<endl;
        
        
    return 0;
}

结果输出:

myvector contains: 10 30 30 10 10 0 0 0


/*remove_copy_if   拷贝一个范围的元素,将其中值满足给定条件的元素删除*/
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

bool IsOdd(int i) {return ((i % 2) == 0);}


int main(int argc, const char * argv[])
{

    int myints[] = {1,2,3,4,5,6,7,8,9};
    vector<int> myvector(9);
    vector<int>::iterator it;
    
    remove_copy_if(myints, myints + 9, myvector.begin(), IsOdd);
    cout<<"myvector contains:";
    for (it = myvector.begin(); it != myvector.end(); ++it)
        cout<<" "<<*it;
    cout<<endl;
    return 0;
}

结果:

myvector contains: 1 3 5 7 9 0 0 0 0

/*replace   将一个范围中值等价于给定值的元素赋值为新的值*/
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;



int main(int argc, const char * argv[])
{

    int myints[] = { 10, 20, 30, 30, 20, 10, 10, 20};
    vector<int> myvector(myints,myints + 8);
    vector<int>::iterator it;
    
    replace(myvector.begin(), myvector.end(), 20, 99);
    cout<<"myvector contains:";
    for (it = myvector.begin(); it != myvector.end(); ++it)
        cout<<" "<<*it;
    cout<<endl;
    
    return 0;
}

myvector contains: 10 99 30 30 99 10 10 99

/*replace_copy   拷贝一个范围的元素,将其中值等价于给定值的元素赋值为新的值*/
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;



int main(int argc, const char * argv[])
{

    int myints[] = { 10, 20, 30, 30, 20, 10, 10, 20};
    vector<int> myvector(8);
    vector<int>::iterator it;
    replace_copy(myints, myints + 8, myvector.begin(), 20, 99);
    cout<<"myvector contains:";
    
    
    for (it = myvector.begin(); it != myvector.end(); ++it)
        cout<<" "<<*it;
    cout<<endl;
    
    return 0;
}

myvector contains: 10 99 30 30 99 10 10 99


/*replace_copy_if   拷贝一个范围的元素,将其中值满足给定条件的元素删除*/
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
bool IsOdd(int i) {return ((i % 2) == 1);}



int main(int argc, const char * argv[])
{

    vector<int> foo,bar;
    vector<int>::iterator it;
    
    
    //set some values:
    for (int i =1; i < 10; i++)
        foo.push_back(i);
    bar.resize(foo.size()); //allocate space
    replace_copy_if(foo.begin(), foo.end(), bar.begin(), IsOdd, 0);
    
    cout<<"bar contains:";
    for (it = bar.begin();it != bar.end() ; ++it)
        cout<<" "<<*it;
    cout<<endl;
    
    return 0;
}

bar contains: 0 2 0 4 0 6 0 8 0

/*replace_if   将一个范围中值满足给定条件的元素赋值为新的值*/
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
bool IsOdd(int i) {return ((i % 2) == 0);}



int main(int argc, const char * argv[])
{


    vector<int> myvector;
    vector<int>::iterator it;
    for (int i = 1; i < 10; i++)
        myvector.push_back(i);
    replace_if(myvector.begin(), myvector.end(), IsOdd, 0);
    cout<<"myvector contains:";
    for (it = myvector.begin(); it != myvector.end(); ++it)
        cout<<" "<<*it;
    cout<<endl;
    return 0;
}

myvector contains: 1 0 3 0 5 0 7 0 9

/*reverse   反转排序指定范围中的元素*/
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int main(int argc, const char * argv[])
{
    vector<int>myvector;
    vector<int>::iterator it;
    for (int i = 1; i < 10; ++i)
        myvector.push_back(i);
    
    reverse(myvector.begin(), myvector.end());

    //print out content:
    cout<<"myvector cotains:";
    for (it = myvector.begin(); it != myvector.end(); ++it)
        cout<<" "<<*it;
    cout<<endl;
    return 0;
}

myvector cotains: 9 8 7 6 5 4 3 2 1

/*reverse_copy   拷贝指定范围的反转排序结果*/
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int main(int argc, const char * argv[])
{
    int myints[] = {1,2,3,4,5,6,7,8,9};
    vector<int> myvector;
    vector<int>::iterator it;
    myvector.resize(9); //allocate space
    reverse_copy(myints, myints + 9, myvector.begin());
    
    //print out content:
    cout<<"myvector contains:";
    for (it = myvector.begin(); it != myvector.end(); ++it)
        cout<<" " <<*it;
    cout<<endl;
    
    
    return 0;
}

myvector contains: 9 8 7 6 5 4 3 2 1

/*rotate   循环移动指定范围中的元素*/
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int main(int argc, const char * argv[])
{
    vector<int> myvector;
    vector<int>::iterator it;
    
    for (int i = 1; i < 10; ++i)
        myvector.push_back(i);
    rotate(myvector.begin(), myvector.begin() + 6, myvector.end());
    
    //print out content:
    cout<<"myvector contains:";
    for (it = myvector.begin(); it != myvector.end(); ++it)
        cout<<" "<<*it;
    cout<<endl;
    return 0;
}

myvector contains: 7 8 9 1 2 3 4 5 6

/*rotate_copy   拷贝指定范围的循环移动结果*/
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int main(int argc, const char * argv[])
{
    int myints[] = {10,20,30,40,50,60,70};
    vector<int> myvector(7);
    vector<int>::iterator it;
    
    rotate_copy(myints, myints + 4, myints + 7, myvector.begin());
    
    //print out content:
    cout<<"myvector contains:";
    for (it = myvector.begin(); it != myvector.end(); ++it)
        cout<< " " <<*it;
    cout<<endl;
    
    
    return 0;
}

myvector contains: 50 60 70 10 20 30 40

/*shuffle   用指定的随机数引擎随机打乱指定范围中的元素的位置*/
#include <iostream>
#include <algorithm>
#include <array>
#include <random>
#include <chrono>

using namespace std;

int main(int argc, const char * argv[])
{

    array<int, 5> foo = {1,9,3,42,5};
    
    //obtain a time-based send:
    unsigned seed = (unsigned)chrono::system_clock::now().time_since_epoch().count();
    shuffle(foo.begin(), foo.end(), default_random_engine(seed));
    
    cout<<"shuffled elements:";
    for (int& x:foo)
        cout<<" "<<x;
    cout<<endl;
    
    return 0;
}

shuffled elements: 9 1 5 42 3

/*swap   交换两个对象的值*/
#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

int main(int argc, const char * argv[])
{


    int x = 10,y = 20;
    swap(x, y);
    vector<int> foo(4,x),bar(6,y);
    vector<int>::iterator it;
    
    swap(foo, bar);
    cout<<"foo contains:";
    
    for (it = foo.begin(); it != foo.end(); ++it)
        cout<<" " <<*it;
    cout<<endl;
        
        
    return 0;
}

foo contains: 10 10 10 10 10 10

/*swap_ranges   交换两个范围的元素*/
#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

int main(int argc, const char * argv[])
{


    vector<int> foo (5,10);
    vector<int> bar (5,33);
    vector<int>::iterator it;
    
    swap_ranges(foo.begin() + 1, foo.end() - 1, bar.begin());
    
    //print out results of swap:
    cout<<"foo contains:";
    for (it = foo.begin(); it != foo.end(); ++it)
        cout<<" "<<*it;
    cout<<endl;
    
    cout<<"bar contains:";
    for (it = foo.begin(); it != foo.end(); ++it)
        cout<<" "<<*it;
    
    cout<<endl;
    return 0;
}

foo contains: 10 33 33 33 10
bar contains: 10 33 33 33 10

/*transform   对指定范围中的每个元素调用某个函数以改变元素的值*/
#include <iostream>
#include <algorithm>
#include <vector>
#include <functional>

int op_increase(int i){return ++i;}

using namespace std;

int main(int argc, const char * argv[])
{


    vector<int> foo;
    vector<int> bar;
    vector<int>::iterator it;
    //set some values:
    for (int i = 1; i < 6; i++)
        foo.push_back(i * 10);
    bar.resize(foo.size());
    
    transform(foo.begin(), foo.end(), bar.begin(), op_increase);
    
    transform(foo.begin(), foo.end(), bar.begin(), foo.begin(),plus<int>());
    
    cout<<"foo contains:";
    for (it = foo.begin(); it != foo.end(); ++it)
        cout<<" "<<*it;
    cout<<endl;
        
    return 0;
}

foo contains: 21 41 61 81 101

/*unique   删除指定范围中的所有连续重复元素,仅仅留下每组等值元素中的第一个元素*/
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

bool myfunction(int i,int j){return (i == j);}


int main(int argc, const char * argv[])
{

    int myints[] = {10,20,20,20,30,30,20,20,10};
    vector<int> myvector(myints,myints + 9);
    vector<int>::iterator it;
    it = unique(myvector.begin(), myvector.end());  //10 20 30 20 10 ? ? ? ?
                                                                //   ^
    myvector.resize(distance(myvector.begin(), it));//10 20 30 20 10
    
    //using predicate comparison:
    unique(myvector.begin(), myvector.end(), myfunction); // (no changes)
    
    //print out content:
    cout<<"myvector contains:";
    for (it = myvector.begin(); it != myvector.end(); ++it)
        cout<<" "<<*it;
    cout<<endl;
    
    return 0;
}

myvector contains: 10 20 30 20 10

/*unique_copy   拷贝指定范围的唯一化(参考上述的 unique)结果*/
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

bool myfunction(int i,int j){return (i == j);}


int main(int argc, const char * argv[])
{

    int myints[] = {10,20,20,20,30,30,20,20,10};
    vector<int> myvector(9);
    
    //using default comparison:
    vector<int>::iterator it;
    it = unique_copy(myints, myints + 9, myvector.begin());
    sort(myvector.begin(), it);
    
    //using predicate comparison:
    it = unique_copy(myvector.begin(), it, myvector.begin(),myfunction);
    
    myvector.resize(distance(myvector.begin(), it));
    cout<<"myvector contains:";
    for (it = myvector.begin(); it != myvector.end(); ++it)
        cout<<" " <<*it;
    cout<<endl;
    
    return 0;
}

myvector contains: 10 20 30



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杜甲同学

感谢打赏,我会继续努力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值