精华内容
下载资源
问答
  • 泛型算法

    2019-09-30 03:45:13
    泛型算法 通用的算法,即泛型算法,大多数定义在头文件algorithm中,标准库还在numeric中定义了一组数值泛型算法。 一般情况下,这些算法不直接操作容器,而是遍历由两个迭代器指定的一个元素范围来操作...

    通用的算法,即泛型算法,大多数定义在头文件algorithm中,标准库还在numeric中定义了一组数值泛型算法。

    一般情况下,这些算法不直接操作容器,而是遍历由两个迭代器指定的一个元素范围来操作。

    例如find()函数,auto result=find(vec.cbegin(),vec.cend(),value);来查找vec容器中指定的value值。

    迭代器令算法不依赖于容器,但是算法依赖于元素类型的操作,例如find()用元素类型的==运算符完成每个元素与给定值的比较。

    算法永远不会改变底层容器的大小,算法可能改变容器中保存的元素的值,也可能在容器内移动,但永远不会直接添加和删除元素。

    inserter(插入迭代器),给这类迭代器赋值时,他们会在底层容器上执行插入操作。因此算法操作这么一个迭代器时,迭代器可以完成向容器添加元素的效果,但算法自身永远不会做这样的操作。

    posted on 2019-09-04 15:04 快牵着我的袜子 阅读(...) 评论(...) 编辑 收藏

    转载于:https://www.cnblogs.com/socks/p/11459239.html

    展开全文
  • C++中的泛型算法

    万次阅读 2018-11-29 09:06:36
    C++中标准库并未给容器添加大量功能,而是提供了一组算法,这些算法大多独立于任何特定的容器,这些算法可用于不同类型的容器和不同类型的元素,它们称为泛型算法。 1 初识泛型算法 1.1 只读算法 (1)find()算法...

    C++中标准库并未给容器添加大量功能,而是提供了一组算法,这些算法大多独立于任何特定的容器,这些算法可用于不同类型的容器和不同类型的元素,它们称为泛型算法。

    1 初识泛型算法

    1.1 只读算法
    (1)find()算法

    int val = 42
    auto result = find(vec.cbegin(), vec.cend(), val);
    cout << "The value" << val << (result == vec.cend() ? "is not present" : "is present") <<endl;
    

    传递给find的前两个参数是表示元素范围的迭代器,第三个参数是一个值。find将范围中的每个元素与给定值进行比较。它将返回指向第一个等于给定值的元素的迭代器,如果范围中无匹配元素,则find返回第二个元素表示搜索失败,我们可以通过比较返回值和第二个参数来判断搜索是否成功。
    (2)accumulate()算法

    string sum = accumulate(v.cbegin(), v.cend(), string(""));
    

    accumulate定义在numeric.h中,将第三个参数作为求和起点,前两个参数为需要求和的元素的范围。第三个参数必须定义了+运算符,故本例中第三个参数不能为一个空串"",因为""为const char*类型,没有+运算符。
    (3)equal()算法
    equal用于确定两个序列是否保存相同的值,它将第一个序列中的每个元素与第二个序列中的对应元素进行比较,如果所有对应元素都相等则返回true,否则返回false。

    // roster2中的元素数目应该至少与roster1一样多
    equal(roster1.cbegin(), roster1.cend(), roster2.cbegin())
    

    equal利用迭代器完成操作,因此我们可以调用equal比较两个不同类型的容器中的元素,元素类型也不必一样,只要能用==比较即可。

    1.2 写容器元素的算法
    (1)fill()算法

    fill(vec.begin(), vec.end(), 0);// 将每个元素重置为0
    fill(vec.begin(), vec.begin() + vec.size()/2, 10);// 将容器的一个子序列设置为10
    

    (2)fill_n()算法

    vector<int> vec;
    fill_n(vec.begin(), vec.size(), 0);// 将所有元素重置为0
    

    函数fill_n()假定写入指定个元素是安全的,调用方式为

    fill_n(dest, n ,val)
    

    fill_n假定dest指向一个元素,而从dest开始的序列至少包含n个元素。

    (3)back_inserter
    插入迭代器(back_inserter)能保证算法有足够元素空间来容纳输出数据。back_inserter接受一个指向容器的引用,返回一个与该容器绑定的插入迭代器。通过此迭代器赋值时,赋值运算符会调用push_back将一个具有给定值的元素添加到容器中。

    vector<int> vec;//空向量
    auto it = back_inserter(vec);//通过它赋值会将元素添加到vec中
    *it = 42;//vec中现在有一个元素42
    

    我们常常使用back_inserter来创建一个迭代器作为算法的目的位置来使用。

    vector<int> vec;//空向量
    fill_n(back_inserter(vec), 10, 0);//添加10个元素到vec
    

    (4)copy()算法
    拷贝(copy)算法是向另一个目的位置迭代器指向的输出序列中的元素写入数据的算法。此算法接受三个迭代器,前两个表示一个输出范围,第三个表示目的序列的起始位置。

    int a1[] = {0,1,2,3,4,5,6,7,8,9};
    int a2[sizeof(a1)/sizeof(*a1)];//a2与a1大小一样
    auto ret = copy(begin(a1), end(a1), a2);//把a1的内容拷贝给a2,ret恰好指向拷贝到a2的尾元素之后的位置
    

    (5)replace()算法和replace_copy()算法
    replace算法接受四个参数:前两个是迭代器,表示输入序列,后两个一个是要搜素的值,另一个是新值,它将所有等于第一个值的元素替换成第二个值。

    replace(ilst.begin(), ilist.end(), 0, 42);//将所有值为0的元素改为42
    

    如果我们希望保留原序列不变,可以调用replace_copy。此算法接受额外三个迭代器参数,指出调整后序列的保存位置。

    replace_copy(ilst.cbegin(), ilist.cend(), back_inserter(ivec), 0, 42);//将所有值为0的元素改为42
    

    1.3 重排容器元素的算法
    消除重复单词:

    void elimDups(vector<string> &words)
    {
    	//按字典序排序words,以便查找重复单词
    	sort(words.begin(), words.end());
    	//unique重排输入范围使得每个单词只出现一次,排列在范围的前部,返回指向不重复区域之后一个位置的迭代器
    	auto end_unique = unique(words.begin(), words.end());
    	//使用向量操作erase删除重复单词
    	words.erase(end_unique, words.end());
    }
    

    1.4 定制操作

    *【注】如果你觉得此文不错,可以考虑打赏我哦,您的打赏将是我更新的最大动力,非常感谢。(打赏也是基于自愿原则的哦( ̄︶ ̄))

    在这里插入图片描述

    展开全文
  • 对于泛型算法后期的一个总结,属于思维导图,知识点汇总 转载于:https://www.cnblogs.com/VCctor/p/5100683.html

    这里写图片描述
    对于泛型算法后期的一个总结,属于思维导图,知识点汇总

    转载于:https://www.cnblogs.com/VCctor/p/5100683.html

    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,238
精华内容 2,895
关键字:

泛型算法