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

C++ 泛型

2016-11-04 00:09 92 查看

C++ 泛型

头文件:
algorithm


find

代码

#include<iostream>
#include<exception>
#include<fstream>
#include<sstream>
#include<string>
#include<vector>
#include<iterator>
#include<list>
#include<deque>
#include<stack>
#include<queue>
#include<concurrent_priority_queue.h>
#include<algorithm>

using namespace std;

int main()
{
cout << "start!" << endl;

int ia[] = {10,20,30};

int *res = find(ia, ia+3, 10);
if (res == cend(ia)) //如果没有找到,则res指向end
{
cout << "can not find" << endl;
}
else
{
cout << "find value : " << res-cbegin(ia) << ", " <<  *res << endl;
}

cout << "end!" << endl;
system("pause");
return EXIT_SUCCESS;
}


说明

find的第一个参数是起始位置,第二个参数是要搜索的末位置的后一位,第三个参数是要寻找的变量值

如果找到的话,返回值是指向容器对应位置的地方;没有找到的话,则返回值指向容器的end

如果需要对应位置的值,直接
*res
,取对应位置的内容即可。

count

说明:按照
C++ primer 5th中的10.1
的练习写的代码

代码

#include<iostream>
#include<exception>
#include<fstream>
#include<sstream>
#include<string>
#include<vector>
#include<iterator>
#include<list>
#include<deque>
#include<stack>
#include<queue>
#include<concurrent_priority_queue.h>
#include<algorithm>

using namespace std;

int main()
{
cout << "start!" << endl;

vector<int> v;
int r;

cout << "Please input vector number" << endl;
while (cin >> r)
{
v.push_back( r );
}

cin.clear(); //使输入流重新有效

while (true)
{
cout << "please input number to find : ";
cin >> r;

int number = count( v.begin(), v.end(), r );
cout << "find same number : " << number << endl;
}

cout << "end!" << endl;
system("pause");
return EXIT_SUCCESS;
}


注意:在
ctrl+z
终止输入后,再次输入时,需要用
cin.clear()
来清空缓冲区。

accumulate

在头文件
numeric


说明:前两个参数是迭代器的始末位置,必须是只读的类型,第三个参数是累加的初始值,必须显式创建,否则会不知道其类型。

代码

#include<iostream>
#include<exception>
#include<fstream>
#include<sstream>
#include<string>
#include<vector>
#include<iterator>
#include<list>
#include<deque>
#include<stack>
#include<queue>
#include<concurrent_priority_queue.h>
#include<algorithm>
#include<numeric>

using namespace std;

int main()
{
cout << "start!" << endl;

vector<int> v;
for (int i = 0; i < 10; i++)
v.push_back(i);
int res = accumulate(v.cbegin(), v.cend(), 0);
cout << res << endl;

vector<string> vs = {"a", "bdsg", "fdr"};
string ress = accumulate(vs.cbegin(), vs.cend(), string(""));
cout << ress << endl;

cout << "end!" << endl;
system("pause");
return EXIT_SUCCESS;
}


fill and fill_n

用于给容器的某些元素赋值

fill是指定要填充的始末和要填充的元素

fill_n是指定要填充的起始位置和填充个数以及要填充的元素

fill_n:个数不能超过当前的容量,否则程序会报错。

代码

#include<iostream>
#include<exception>
#include<fstream>
#include<sstream>
#include<string>
#include<vector>
#include<iterator>
#include<list>
#include<deque>
#include<stack>
#include<queue>
#include<concurrent_priority_queue.h>
#include<algorithm>
#include<numeric>

using namespace std;

int main()
{
cout << "start!" << endl;
vector<string> vs = {"a", "bdsg", "fdr"};

fill_n( vs.begin(), vs.size(), string("0") );
fill(vs.begin(), vs.end(), string("23"));

cout << "end!" << endl;
system("pause");
return EXIT_SUCCESS;
}


copy and replace and replace_copy

copy:复制

replace:替换

replace_copy:将源容器中的所有要进行迭代的数据复制到一个新的容器中,是以
back_inserter
的形式插入(在末尾添加的形式)

代码

#include<iostream>
#include<exception>
#include<fstream>
#include<sstream>
#include<string>
#include<vector>
#include<iterator>
#include<list>
#include<deque>
#include<stack>
#include<queue>
#include<concurrent_priority_queue.h>
#include<algorithm>
#include<numeric>

using namespace std;

int main()
{
cout << "start!" << endl;

vector<int> orig;
auto it = back_inserter( orig );
for (int i = 0; i < 10; i++)
{
*it = i;
}
vector<int> res1( orig.size() );
copy(orig.begin(), orig.end(), res1.begin());
replace( orig.begin(), orig.end(), 0, 233 );
vector<int> res2;
replace_copy(orig.begin(), orig.end(), back_inserter(res2), 1, 455);

cout << "end!" << endl;
system("pause");
return EXIT_SUCCESS;
}


sort and unique and erase

说明:去除容器中重复的元素

unique接受排序后的容器列表

代码

#include<iostream>
#include<exception>
#include<fstream>
#include<sstream>
#include<string>
#include<vector>
#include<iterator>
#include<list>
#include<deque>
#include<stack>
#include<queue>
#include<concurrent_priority_queue.h>
#include<algorithm>
#include<numeric>

using namespace std;

int main()
{
cout << "start!" << endl;

string str = "a b c d s f g s e d a s b";
stringstream sstream(str);
vector<string> vs;
while (sstream >> str)
{
vs.push_back( str );
}

//按照 < 的运算符进行排列,最小的排在最前面
sort( vs.begin(), vs.end() );

//unique接受有序容器,返回值指向不重复区域之后一个位置的迭代器
auto end_unique = unique( vs.begin(), vs.end() );

vs.erase( end_unique, vs.end() );

cout << "end!" << endl;
system("pause");
return EXIT_SUCCESS;
}


lambda

说明:除了可以接受自己的函数参数列表,还可以捕获所在函数的局部变量,并使用在程序中

代码

#include<iostream>
#include<exception>
#include<fstream>
#include<sstream>
#include<string>
#include<vector>
#include<iterator>
#include<list>
#include<deque>
#include<stack>
#include<queue>
#include<concurrent_priority_queue.h>
#include<algorithm>
#include<numeric>

using namespace std;

int main()
{
cout << "start!" << endl;

auto func_add_1 = [](int a, int b) {return a + b; };

cout << func_add_1(3,3) << endl;

int num1 = 3;

auto func_add_2 = [num1](int num){ return num + num1; };

cout << func_add_2(5) << endl;

cout << "end!" << endl;
system("pause");
return EXIT_SUCCESS;
}


func_add_1
:传入的参数

func_add_2
:捕获列表

bind and count_if

count_if
:记录容器中满足条件的个数,条件可以用
lambda表达式
给出

bind
:用于修改函数的一些属性,如传参的顺序,可以通过修改占位符来修改传参的顺序

代码

#include<iostream>
#include<exception>
#include<fstream>
#include<sstream>
#include<string>
#include<vector>
#include<iterator>
#include<list>
#include<deque>
#include<stack>
#include<queue>
#include<concurrent_priority_queue.h>
#include<algorithm>
#include<numeric>
#include<functional>  //bind

using namespace std;

bool Smaller(const int &a, const int &b)
{
return a <= b;
}

int main()
{
cout << "start!" << endl;

string str = "a by-value capture cannot be modified in a non-mutable lambda";
stringstream sstream(str);
vector<string> vs;
while (sstream >> str)
{
vs.push_back(str );
}

int cnt = count_if(vs.begin(), vs.end(), [](string str) -> bool{return str.length() >= 8; });
cout << cnt << endl;

vector<int> vi = { 1, 4, 6, 8, 2, 5, 3 };
sort(vi.begin(), vi.end(), bind<int>(Smaller, std::placeholders::_2, std::placeholders::_1));
for_each(vi.begin(), vi.end(), [](int n){cout << n << endl; });

cout << "end!" << endl;
system("pause");
return EXIT_SUCCESS;
}


inserter and front_inserter

inserter
:插入元素后,迭代器的位置指向刚刚插入元素的位置

front_inserter
:元素总是插入到第一个迭代器元素之前

代码

#include<iostream>
#include<exception>
#include<fstream>
#include<sstream>
#include<string>
#include<vector>
#include<iterator>
#include<list>
#include<deque>
#include<stack>
#include<queue>
#include<concurrent_priority_queue.h>
#include<algorithm>
#include<numeric>
#include<functional>  //bind

using namespace std;

int main()
{
cout << "start!" << endl;

list<int> lst = {1,2,3,4};
list<int> lst2, lst3;

copy(lst.cbegin(), lst.cend(), front_inserter(lst2));
copy(lst.cbegin(), lst.cend(), inserter(lst3, lst3.begin()));

for_each(lst2.begin(), lst2.end(), [](int num){cout << num << endl; });
for_each(lst3.begin(), lst3.end(), [](int num){cout << num << endl; });

cout << "end!" << endl;
system("pause");
return EXIT_SUCCESS;
}


istream_iterator

流迭代器

说明:可以从流迭代器初始化容器

#include<iostream>
#include<exception>
#include<fstream>
#include<sstream>
#include<string>
#include<vector>
#include<iterator>
#include<list>
#include<deque>
#include<stack>
#include<queue>
#include<concurrent_priority_queue.h>
#include<algorithm>
#include<numeric>
#include<functional>  //bind

using namespace std;

int main()
{
cout << "start!" << endl;

istream_iterator<int> in_iter(cin), eof;
vector<int> vi(in_iter, eof);

for_each(vi.begin(), vi.end(), [](int num){cout << num << endl; });

cout << "end!" << endl;
system("pause");
return EXIT_SUCCESS;
}


输出容器中所有数据的两种方法

for_each


for_each(vi.begin(), vi.end(), [](int num){cout << num << endl; });


copy


ostream_iterator<int> out_iter(cout, "\r\n" );
copy( vi.begin(), vi.end(), out_iter );
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ C++primer