您的位置:首页 > 编程语言 > C语言/C++

C++ STL实例(二)

2016-05-25 00:37 357 查看

元素计数

#if 0
/*元素计数*/
#include<iostream>
#include<vector>
#include<set>
#include<algorithm>
#include<functional>//函数对象预定义
using namespace std;

template<typename Container>
void print(const Container &c);//模板函数
bool even(int elem);//一元谓词
int main()
{
vector<int> a;
for(int i=0;i<10;++i)
a.push_back(i);//加入到a中
print(a);

int n;
//查找个数
n=count(a.begin(),a.end(),6);
cout<<"number(6):"<<n<<endl;

//count_if
//n=count_if(a.begin(),a.end(),even);
/*bind2nd 绑定*/
n=count_if(a.begin(),a.end(),bind2nd(modulus<int>(),2));
cout<<"奇数个数:"<<n<<endl;

n=count_if(a.begin(),a.end(),not1(bind2nd(modulus<int>(),2)));
cout<<"偶数个数:"<<n<<endl;

//大于4的个数
n=count_if(a.begin(),a.end(),bind2nd(greater<int>(),4));
cout<<"number(>4):"<<n<<endl;
cout<<endl;

multiset<int> mst;
for(int j=0;j<10;++j)
mst.insert(mst.end(),j);
mst.insert(2);
mst.insert(7);
print(mst);

n=count(mst.begin(),mst.end(),7);//查看7的个数(1)
cout<<"number(7):"<<n<<endl;

n=mst.count(7);//查看7的个数(2),使用成员函数,速度较快
cout<<"number(7):"<<n<<endl;
return 0;
}

//display
template<typename Container>
void print(const Container &c)//模板函数
{
Container::const_iterator i=c.begin();
while(i!=c.end())
{
cout<<*i<<endl;
++i;
}
cout<<endl;
}

bool even(int elem)
{
return elem%2==0;//返回偶数
}
#endif

max-min

#if 0
/*max-min*/
#include<iostream>
#include<algorithm>
#include<deque>
#include<functional>
using namespace std;

bool absless(int elem1,int elem2);

template<typename Container>
void print(const Container &c);//模板函数
int main()
{
deque<int> a;
for(int i=0;i<10;i++)
a.insert(a.end(),i);
print(a);

//min
int n;
n=*min_element(a.begin(),a.end());//返回值为迭代器
cout<<"min:"<<n<<endl;

//max
//deque<int> result=max_element(a.begin(),a.end());
n=*max_element(a.begin(),a.end());
cout<<"max:"<<n<<endl;

//abs-min
n=*min_element(a.begin(),a.end(),absless);
cout<<"abs-min:"<<n<<endl;

//abs-max
//abs-min
n=*max_element(a.begin(),a.end(),absless);
cout<<"abs-max:"<<n<<endl;
return 0;
}

//display
template<typename Container>
void print(const Container &c)//模板函数
{
Container::const_iterator i=c.begin();
while(i!=c.end())
{
cout<<*i<<endl;
++i;
}
cout<<endl;
}

bool absless(int elem1,int elem2)//以绝对值计算
{
return abs(elem1)<abs(elem2);
}
#endif

for_each()

#if 0
/*for_each*/
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;

void print(int elem);//函数

template <class T>//模板
class addValue
{
private:
T theValue;
public:
addValue(const T& v):theValue(v){}
void operator()(T& elem) const
{
elem+=theValue;
}
};

class avgValue
{
private:
long num;
long sum;
public:
avgValue():num(0),sum(0){}

void operator()(int elem)
{
num++;
sum+=elem;
}
double avg()
{
return static_cast<double>(sum)/static_cast<double>(num);//类型转换
}

operator double()//double运算符重载
{
return static_cast<double>(sum)/static_cast<double>(num);
}
};

int main()
{
vector<int> ve;
for(int i=1;i<10;++i)
ve.push_back(i);
for_each(ve.begin(),ve.end(),print);//遍历
cout<<endl;

//add 10
for_each(ve.begin(),ve.end(),addValue<int>(10));//在每个数的基础上+10
for_each(ve.begin(),ve.end(),print);
cout<<endl;

//add 1
for_each(ve.begin(),ve.end(),addValue<int>(*(ve.begin())));//每个数+1
for_each(ve.begin(),ve.end(),print);
cout<<endl;

//avgValue
/*avgValue xc=for_each(ve.begin(),ve.end(),avgValue());*/
double xc=for_each(ve.begin(),ve.end(),avgValue());//直接接受double
cout<<"avg:"<<xc<<endl;//求出平均值
return 0;
}

//display
void print(int elem)//函数
{
cout<<elem<<" ";
}
#endif

区间比较

#if 0
/*区间比较*/
#include<iostream>
#include<algorithm>
#include<vector>
#include<list>
using namespace std;

template<typename Container>
void print(const Container &c);//模板函数
bool both(int elem1,int elem2);//二元谓词函数

int main()
{
vector<int> ve;
list<int> li;
for(int i=1;i<8;++i)
ve.push_back(i);
for(int j=3;j<10;j++)
li.insert(li.end(),j);
cout<<"vector:"<<endl;
print(ve);
cout<<"list:"<<endl;
print(li);
cout<<endl;

//equal比较区间元素是否相等
bool xc=equal(ve.begin(),ve.end(),li.begin());
if(xc)
cout<<"相等!!!"<<endl;
else
cout<<"不相等!!!"<<endl;
cout<<endl;

//使用谓词比较
if(equal(ve.begin(),ve.end(),li.begin(),both))
cout<<"奇偶对应!!!"<<endl;
else
cout<<"奇偶不对应!!!"<<endl;
cout<<endl;

//mismatch比较找出不相同的位置
//返回值为pair
pair<vector<int>::iterator,list<int>::iterator> xc1;
xc1=mismatch(ve.begin(),ve.end(),li.begin());
if(xc1.first==ve.end())
{
cout<<"没有不相同的位置!!!"<<endl;//但两个区间不一定相等
}
else
{
cout<<"找到不相等的数:"<<*xc1.first<<" and "<<*xc1.second<<endl;
}
cout<<endl;

//mismatch使用谓词
xc1=mismatch(ve.begin(),ve.end(),li.begin(),less_equal<int>());//使用函数预定义(小于等于)
if(xc1.first==ve.end())
cout<<"没有找到(没有大于的数)!!!"<<endl;
else
cout<<"找到大于的数:"<<*xc1.first<<" and "<<*xc1.second<<endl;
cout<<endl;

//lexicographical_compare()检查第一个区间是否小于第二个区间
bool tx;
tx=lexicographical_compare(ve.begin(),ve.end(),li.begin(),li.end());
if(tx)
cout<<"ve<li"<<endl;
else
cout<<"ve>=li"<<endl;

return 0;
}

//display
template<typename Container>
void print(const Container &c)//模板函数
{
Container::const_iterator i=c.begin();
while(i!=c.end())
{
cout<<*i<<" ";
++i;
}
cout<<endl;
}

bool both(int elem1,int elem2)
{
return elem1%2==elem2%2;//判断两个容器相应位置是否同为奇偶数
}
#endif

复制元素

#if 0
/*复制元素*/
#include<iostream>
#include<algorithm>
#include<vector>
#include<list>
using namespace std;

template<typename Container>
void print(const Container &c);//模板函数

int main()
{
list<int> li;
for(int i=0;i<10;++i)
li.push_back(i);
cout<<"list(li):"<<endl;
print(li);
cout<<endl;

//vector
vector<int> ve(li.size()*2);//存放20个数
cout<<"vector(ve):"<<endl;
print(ve);
cout<<endl;

//copy
copy(li.begin(),li.end(),ve.begin());
cout<<"li-ve:"<<endl;
print(ve);
cout<<endl;

//copy_backward
copy_backward(li.begin(),li.end(),ve.end());
cout<<"li-ve(1):"<<endl;
print(ve);
cout<<endl;
}

//display
template<typename Container>
void print(const Container &c)//模板函数
{
Container::const_iterator i=c.begin();
while(i!=c.end())
{
cout<<*i<<" ";
++i;
}
cout<<endl;
}
#endif

copy()

#if 0
/*copy*/
#include<iostream>
#include<algorithm>
#include<vector>
#include<list>
using namespace std;

template<typename Container>
void print(const Container &c);//模板函数

int main()
{
vector<int> ve;
//list<int> li(9);
list<int> li;
for(int i=1;i<10;++i)
ve.push_back(i);
cout<<"vector(ve):"<<endl;
print(ve);
cout<<endl;

//copy(ve.begin(),ve.end(),li.begin());
copy(ve.begin(),ve.end(),back_inserter(li));
cout<<"ve-list:"<<endl;
print(li);
cout<<endl;

//拷贝到输出流
copy(ve.begin(),ve.end(),ostream_iterator<int>(cout," "));
cout<<endl;
cout<<endl;

//逆向
copy(ve.rbegin(),ve.rend(),li.begin());
//显示copy(li.begin(),li.end(),ostream_interator<int>(cout," "));
cout<<"copy(逆向):"<<endl;
print(li);
cout<<endl;
return 0;
}

//display
template<typename Container>
void print(const Container &c)//模板函数
{
Container::const_iterator i=c.begin();
while(i!=c.end())
{
cout<<*i<<" ";
++i;
}
cout<<endl;
}
#endif

char  copy

#if 0
/*char copy*/
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

template<typename Container>
void print(const Container &c);//模板函数

int main()
{
vector<char> ve(10,'.');
for(int i='a';i<'g';++i)//for(char i='a';i<'g';++i)
{
ve.push_back(i);
}
ve.insert(ve.end(),10,'.');
cout<<"ve:"<<endl;
print(ve);
cout<<endl;

//copy
vector<char> ve1(ve.begin(),ve.end());
cout<<"ve1:"<<endl;
print(ve1);
cout<<endl;

//限定区间拷贝
copy(ve1.begin()+10,ve1.begin()+16,ve1.begin()+7);
cout<<"ve1(new):"<<endl;
print(ve1);
cout<<endl;

//ve2
vector<char> ve2(ve.begin(),ve.end());
cout<<"ve2:"<<endl;
print(ve2);
cout<<endl;

//copy
copy(ve2.begin()+10,ve2.begin()+16,ve2.begin()+19);
cout<<"ve2(new):"<<endl;
print(ve2);
cout<<endl;
return 0;
}

//display
template<typename Container>
void print(const Container &c)//模板函数
{
Container::const_iterator i=c.begin();
while(i!=c.end())
{
cout<<*i<<" ";
++i;
}
cout<<endl;
}
#endif

transform()

#if 0
/*transform*/
#include<iostream>
#include<vector>
#include<list>
#include<algorithm>
using namespace std;

template<typename Container>
void print(const Container &c);//模板函数

int main()
{
vector<int> ve;
list<int> li;
for(int i=1;i<10;++i)
ve.push_back(i);
cout<<"ve:"<<endl;
print(ve);
cout<<endl;

//transform
transform(ve.begin(),ve.end(),ve.begin(),negate<int>());//取负
cout<<"-ve:"<<endl;
print(ve);
cout<<endl;

//
transform(ve.begin(),ve.end(),back_inserter(li),bind2nd(multiplies<int>(),5));//ve乘5
cout<<"li(ve*5):"<<endl;
print(li);
cout<<endl;

//流迭代器
cout<<"ve(cout):"<<endl;
transform(li.begin(),li.end(),ostream_iterator<int>(cout," "),negate<int>());
cout<<endl;

return 0;
}

//display
template<typename Container>
void print(const Container &c)//模板函数
{
Container::const_iterator i=c.begin();
while(i!=c.end())
{
cout<<*i<<" ";
++i;
}
cout<<endl;
}
#endif

集合的合并

#if 0
/*多个集合进行运算合并到一个集合*/
#include<iostream>
#include<vector>
#include<list>
#include<algorithm>
using namespace std;

template<typename Container>
void print(const Container &c);//模板函数

int main()
{
vector<int> ve;
vector<int> ve1;
list<int> li;
for(int i=1;i<10;++i)
ve.push_back(i);
for(int j=11;j<20;++j)
ve1.push_back(j);
cout<<"ve:"<<endl;
print(ve);
cout<<endl;

cout<<"ve1:"<<endl;
print(ve1);
cout<<endl;

//transform(b1,e1,b2,b3,op) ve*ve
transform(ve.begin(),ve.end(),ve.begin(),ve.begin(),multiplies<int>());
cout<<"ve(new):"<<endl;
print(ve);
cout<<endl;

//ve1*ve(new)
transform(ve.begin(),ve.end(),ve1.begin(),ve1.begin(),multiplies<int>());
cout<<"ve1(new):"<<endl;
print(ve1);
cout<<endl;

//ve1(new)+ve(new)=li
transform(ve.begin(),ve.end(),ve1.begin(),back_inserter(li),plus<int>());
cout<<"li:"<<endl;
print(li);
cout<<endl;
return 0;
}

//display
template<typename Container>
void print(const Container &c)//模板函数
{
Container::const_iterator i=c.begin();
while(i!=c.end())
{
cout<<*i<<" ";
++i;
}
cout<<endl;
}
#endif

排列组合

#if 0
/*排列组合*/
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

template<typename Container>
void print(const Container &c);//模板函数

int main()
{
vector<int> ve;
ve.push_back(1);
ve.push_back(2);
ve.push_back(3);

cout<<"ve:"<<endl;
print(ve);
cout<<endl;
/*
//next_permutation() 1
next_permutation(ve.begin(),ve.end());
cout<<"ve(1):"<<endl;
print(ve);
cout<<endl;

//next_permutation() 2
next_permutation(ve.begin(),ve.end());
cout<<"ve(2):"<<endl;
print(ve);
cout<<endl;*/
cout<<"排列为(1,2,3):"<<endl;
while(next_permutation(ve.begin(),ve.end()))//返回值为bool
{
print(ve);
}
cout<<endl;

vector<int> ve1;
ve1.push_back(3);
ve1.push_back(1);
ve1.push_back(2);
cout<<"ve1:"<<endl;
print(ve1);
cout<<endl;

//prev_permulation() 降序
/*prev_permutation(ve1.begin(),ve1.end());
cout<<"排列1:"<<endl;
print(ve1);
cout<<endl;
print(ve1);*/

cout<<"排列为(3,1,2):"<<endl;
while(prev_permutation(ve1.begin(),ve1.end()))
{
print(ve1);
}
cout<<endl;

return 0;
}

//display
template<typename Container>
void print(const Container &c)//模板函数
{
Container::const_iterator i=c.begin();
while(i!=c.end())
{
cout<<*i<<" ";
++i;
}
cout<<endl;
}
#endif

交换算法

#if 0
/*交换算法*/
#include<iostream>
#include<vector>
#include<deque>
#include<algorithm>
using namespace std;

template<typename Container>
void print(const Container &c);//模板函数

int main()
{
vector<int> ve;
deque<int> de;
for(int i=1;i<10;++i)
ve.push_back(i);
cout<<"ve:"<<endl;
print(ve);
cout<<endl;

for(int j=11;j<24;++j)
de.push_back(j);
cout<<"de:"<<endl;
print(de);
cout<<endl;

//swap_ranges()交换相同的字节数(灵活)
swap_ranges(ve.begin(),ve.end(),de.begin());
cout<<"ve(new):";print(ve);
cout<<"de(new):";print(de);
cout<<endl;

//swap_ranges()返回值为迭代器(第二个容器内没有交换的数)
deque<int>::iterator xc;
xc=swap_ranges(ve.begin(),ve.end(),de.begin());
if(xc!=de.end())
{
cout<<"还有数据未交换!!!"<<endl;
cout<<"第一个没有交换的数:"<<*xc<<endl;//未交换第一个数
}
else
{
cout<<"所有数据都已经交换!!!"<<endl;
}
cout<<endl;

//分段交换
swap_ranges(de.begin(),de.begin()+3,de.rbegin());
cout<<"分段交换:";
print(de);
cout<<endl;

vector<int> ve1;
vector<int> ve2;

ve1.push_back(2);
ve1.push_back(8);
ve1.push_back(10);

ve2.push_back(23);
ve2.push_back(33);
ve2.push_back(43);
cout<<"ve1:";print(ve1);
cout<<"ve2:";print(ve2);
//cout<<ve1.at(1);//显示
cout<<endl;
//赋值操作进行互换
//ve1=ve2;//速度慢

//使用swap成员函数,速度最快
ve1.swap(ve2);
cout<<"ve1(new):";print(ve1);
cout<<"ve2(new):";print(ve2);

return 0;
}

//display
template<typename Container>
void print(const Container &c)//模板函数
{
Container::const_iterator i=c.begin();
while(i!=c.end())
{
cout<<*i<<" ";
++i;
}
cout<<endl;
}
#endif
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: