/*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