10.2 A First Look at the Algorithms(算法的初遇)

#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <numeric>

using namespace std;

int main()
{
    vector<int> vec = { 1, 2, 3, 4 };
    int sum = accumulate(vec.cbegin(), vec.cend(), 0);

    cout << "The Sum is: " << sum << endl;

    system("PAUSE");
    return 0;
}

accumulate()第三个参数为计算的初始值,使用时,在序列中的元素必须匹配或者可转换成第三个参数的类型。

#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <numeric>

using namespace std;

int main()
{
    vector<string> vec = { "hei ", "ni ", "hao" };
    string sum = accumulate(vec.cbegin(), vec.cend(), string(""));
    //若不转换,""默认为char *, const char[1]

    cout << "The Sum is: " << sum << endl;

    system("PAUSE");
    return 0;
}

 

10.2.2 Algorithms That Write Container Elements

调用fill_n(或者类似的写入元素算法),对一个空的容器调用迭代器写入元素。

 

#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <numeric>

using namespace std;

int main()
{
    vector<int> vec = { 0, 1, 2, 3 };
    //fill(vec.begin(), vec.end(), 9);都用9填充
    fill_n(vec.begin(), vec.size(), 0);
    //用0填充vec中vec.size()个元素
    

    for (auto &i : vec) {
        cout << i << " ";
    }

    system("PAUSE");
    return 0;
}

 

back_inserter对一个容器采用引用,并且返回一个插入迭代器绑定到容器,当我们通过这个迭代器赋值时,赋值将调用push_back去增加一个给定的值到容器当中。

 

#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <numeric>

using namespace std;

int main()
{
    vector<int> vec = { 0, 1, 2, 3 };
    
    auto iter = back_inserter(vec);

    *iter = 4;
    *iter = 5;

    for (auto &i : vec) {
        cout << i << " ";
    }

    system("PAUSE");
    return 0;
}

 

   vector<int> vec = { 0, 1, 2, 3 };
    
    auto iter = back_inserter(vec);

    fill_n(back_inserter(vec), 5, 6);
    //append six elements to vec

 

copy():


fill_n(begin(vec), sizeof(vec) / sizeof(int), 0);

for (auto &i : vec) {
cout << i << endl;
}

  int a1[] = { 1, 2, 3 };
    int a[sizeof(a1) / sizeof(*a1)];

    auto co = copy(begin(a1), end(a1), a);

    for (int i = 0; i < (sizeof(a1) / sizeof(*a1)); ++i) {
        cout << a[i] << endl;
    }

    cout << *(co - 1) << endl;
    //co指向a2最后一个元素的后一位

 

   vector<int> vec = { 10, 15, 16 };
    vector<int> vec1;

    copy(vec.begin(), vec.end(), back_inserter(vec1));

 

在本章中提到,标准库算法不会改变他们所操作的容器大小。为什么使用back_inserter不会使这一断言失效?

  总的来说就是迭代器的原因。标准库算法从来不直接操作容器,它们只操作迭代器,从而间接访问容器,能不能插入和删除元素,不在于算法,而在于传递给它们的迭代器是否具有这样的能力。

  严格来说,标准库算法根本不知道又“容器”这个东西。

 

void elimDups(vector<string> &word) {
    sort(word.begin(), word.end());
    //将容器元素按照字母顺序排序
    auto end_unique = unique(word.begin(), word.end());
    //将相同元素留一个,其它置空放最后。
    word.erase(end_unique, word.end());
    //删除重复元素,从end_unique1到word.end()前一元素
}

int main()
{
    vector<string> vec = { "hello", "ni", "ai", "ni", "wp", "hello", "ni" };

    elimDups(vec);

    for (auto &i : vec) {
        cout << i << " ";
    }
posted @ 2018-11-01 22:07  Hk_Mayfly  阅读(194)  评论(0)    收藏  举报