本文主要是介绍C++ Primer 5th笔记(10)chapter10 泛型算法 : read,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
标准库提供一组不依赖特定的容器类型的共性算法
- 指定迭代器范围, eg. [begin, end)这种左闭包
- 3种类型: 只读、写、sort
1. find 查询
template<class InIt, class T>
InIt find(InIt first, InIt last, const T& val);
查询迭代器指定范围[first, last)范围内是否有val值。如果有,则返回该值对应的迭代器;否则,返回last表示查找失败
eg. 结果为"42 a value -858993460"
int val = 42;
vector<int> vec = {2, 42};
auto result = find(vec.cbegin(), vec.cend(), val);
cout << " " << *result;string strVal = "a value";
list<string> lst = { "a value", "xxx", "yyy" };
auto result3 = find(lst.cbegin(), lst.cend(), strVal);
cout << " " << *result3;int ia[] = { 32, 3 };
auto result2 = find(begin(ia), end(ia), val);
cout << " " << *result2;
2. accumulate 对范围求和 (numeric.h)
template<class InIt, class T>
T accumulate(InIt first, InIt last, T val);
template<class InIt, class T, class Pred>
T accumulate(InIt first, InIt last, T val, Pred pr);
累加迭代器指定范围[first, last)范围内所有元素,再加上累加的初值val,返回累加的结果。第二个函数自定义操作:val = pr(val, *it)。
注:用于指定累加起始值的第三个参数是必要的,因为算法对将要累加的元素类型一无所知,没有别的办法创建合适的起始值或者关联的类型。
eg. 结果为"6 a valuexxxyyy 45"
vector<int> vec1 = { 1,2,3 };
int result = accumulate(vec1.begin(), vec1.end(), 0);
cout << " " << result;list<string> lst = { "a value", "xxx", "yyy" };
string result2 = accumulate(lst.cbegin(), lst.cend(), string(""));
cout << " " << result2;std::array<int, 10> ia = { 1,2,3,4,5,6,7,8,9,0 };
auto result3 = accumulate(ia.cbegin(), ia.cend(), 0);
cout << " " << result3;
3. find_first_of算法
template<class FwdIt1, class FwdIt2>
FwdIt1 find_first_of(FwdIt1 first1, FwdIt1 last1, FwdIt2 first2, FwdIt2 last2);
template<class FwdIt1, class FwdIt2, class Pred>
FwdIt1 find_first_of(FwdIt1 first1, FwdIt1 last1, FwdIt2 first2, FwdIt2 last2, Pred pr);
查询第一段范围内与第二段范围内任意元素匹配的元素的位置。如果找到,返回该元素对应的迭代器;否则,返回last1。第二个函数使用判断:pr(*it1, *it2)来代替第一个函数中的判断:*it1 == *it2。
eg. 输出为"not found"
vector<int> vec = { 2, 42 };int ia[] = { 32, 3 };auto result = find_first_of(vec.cbegin(), vec.cend(), begin(ia), end(ia));if(result == vec.end())cout << "not found ";elsecout << " " << *result;
4. equal
equal:判断给定两个区间是否相等。假定第二个序列至少与第一个序列一样长 (algorithm.h)
eg.
bool bIsEqual = equal(v1.cbegin(), v1.cend(), v2.cbegin());
bool bIsEqual = equal(v1.cbegin(), v1.cend(), v2.cbegin(), vc2.cend());
并不要求两个容器的元素类型相同,只要能使用比较运算符==就可以了。比如
eg. 输出为"1"
list<string> lst = { "a value", "xxx", "yyy" }; vector<const char*> vec = { "a value", "xxx", "yyy" }; auto result = equal(vec.cbegin(), vec.cend(), lst.cbegin(), lst.cend());cout << " " << result;
5. count
查找个数
eg.输出为2:
vector<int> v2 = { 4,5,6,7,8,9,4 }; auto result = count(v2.cbegin(), v2.cend(), 4);cout << " " << result;
【引用】
- 代码 https://github.com/thefistlei/cplusprimer/blob/main/cprimer/cprimer/genericAlgorithm.h
这篇关于C++ Primer 5th笔记(10)chapter10 泛型算法 : read的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!