PoEdu培训 STL班 第十三课 STL源码解析之算法(三)
文章类别: 培训笔记 0 评论

PoEdu培训 STL班 第十三课 STL源码解析之算法(三)

文章类别: 培训笔记 0 评论

STL之算法(三)

复习

算法中, 接受的参数基本上都是迭代器.
迭代器作为一个承接的桥梁.

分区算法

is_partitioned

#include <iostream>     // std::cout
#include <algorithm>    // std::is_partitioned
#include <array>        // std::array

bool IsOdd (int i) { return (i%2)==1; }

int main () {
  std::array<int,7> foo {1,2,3,4,5,6,7};

  // print contents:
  std::cout << "foo:"; for (int& x:foo) std::cout << ' ' << x;
  if ( std::is_partitioned(foo.begin(),foo.end(),IsOdd) )
    std::cout << " (partitioned)\n";
  else
    std::cout << " (not partitioned)\n";

  // partition array:
  std::partition (foo.begin(),foo.end(),IsOdd);

  // print contents again:
  std::cout << "foo:"; for (int& x:foo) std::cout << ' ' << x;
  if ( std::is_partitioned(foo.begin(),foo.end(),IsOdd) )
    std::cout << " (partitioned)\n";
  else
    std::cout << " (not partitioned)\n";

  return 0;
}
运行结果:
foo: 1 2 3 4 5 6 7 (not partitioned)
foo: 1 7 3 5 4 6 2 (partitioned)

partition

stable_partition

#include <iostream>
#include <algorithm>
#include <vector>

int main()
{
    std::vector<int> myvector;
    myvector.resize(10);
    std::generate(myvector.begin(), myvector.end(), []() { return rand() % 10; });
    std::cout << "myvector's orig data:";
    std::for_each(myvector.begin(), myvector.end(), [](int i) {std::cout << i << ","; });
    std::cout << "\n ----------------- \n";

    std::vector<int> vecPartition, vecSPartition;
    vecPartition = myvector;
    vecSPartition = myvector;

    auto iter = std::partition(vecPartition.begin(), vecPartition.end(), 
        [](int i) { return ((i % 2) == 1); });

    std::cout << "partition odd elements:";
    std::for_each(vecPartition.begin(), iter, [](int i) {std::cout << i << ","; });
    std::cout << '\n';

    std::cout << "partition even elements:";
    std::for_each(iter, vecPartition.end(), [](int i) {std::cout << i << ","; });
    std::cout << '\n';

    std::cout << "now vecPartition's data:";
    std::for_each(vecPartition.begin(), vecPartition.end(), [](int i) {std::cout << i << ","; });
    std::cout << "\n ----------------- \n";

    auto bound = std::stable_partition(vecSPartition.begin(), vecSPartition.end(),
        [](int i) { return ((i % 2) == 1); });

    std::cout << "stable_partition odd elements:";
    std::for_each(vecSPartition.begin(), bound, [](int i) {std::cout << i << ","; });
    std::cout << '\n';

    std::cout << "stable_partition even elements:";
    std::for_each(bound, vecSPartition.end(), [](int i) {std::cout << i << ","; });
    std::cout << '\n';

    std::cout << "now vecSPartition's data:";
    std::for_each(vecSPartition.begin(), vecSPartition.end(), [](int i) {std::cout << i << ","; });
    std::cout << '\n';

    return 0;
}

Alt 执行效果

partition_copy

partition_point

排序算法

sort

stable_sort

partial_sort

#include <iostream>
#include <algorithm>
#include <vector>

int main()
{
    std::vector<int> demoSort, demoPSort;
    demoSort.resize(20);
    demoPSort.resize(20);
    std::generate(demoSort.begin(), demoSort.end(), []() { return rand() % 40; });
    demoPSort = demoSort;
    std::sort(demoSort.begin(), demoSort.begin() + 10);
    std::partial_sort(demoPSort.begin(), demoPSort.begin() + 10, demoPSort.end());
    std::for_each(demoSort.begin(), demoSort.end(), [](int i) {std::cout << i << ","; });
    std::cout << std::endl;
    std::for_each(demoPSort.begin(), demoPSort.end(), [](int i) {std::cout << i << ","; });
    std::cout << "\n=========================" << std::endl;
    return 0;
}

Alt 执行效果

partial_sort_copy

is_sorted

is_sorted_until

nth_element

#include <iostream>
#include <algorithm>
#include <vector>

int main()
{
    std::cout << "\n=========================" << std::endl;

    std::vector<int> demo;
    demo.resize(20);
    std::generate(demo.begin(), demo.end(), []() { return rand() % 40; });
    std::nth_element(demo.begin(), demo.begin() + 8, demo.end());
    std::for_each(demo.begin(), demo.end(), [](int i) {std::cout << i << ","; });

    return 0;
}

Alt 执行效果

其他算法整理中......

未完待续...

如有错误,请提出指正!谢谢.

回复