加锁和解锁,也可以在构造函数和析构函数里面,自动调用。

相等和等价的关系:等价是用在排序的时候,跟less函数有关。

vector,deque,string 要用erase-remove组合;而关联容器,直接erase就可以了。

copy(x.begin(), x.end(), ostream_iterator<string>(cout, "\n"));

但是如果x的类型是string*,就不行。

自定义一个print(const string*ps);

然后 for_each(x.begin(), x.end(), print);

或者

struct Dereference{

template<typename T>

const T& operator()(const T* ptr)const {

return *ptr;

}

}

transform(x.begin(), x.end(),

ostream_iterator<string>(cout, "\n"),

Dereference());

注意transform的两种形式:

template < class InputIterator, class OutputIterator, class UnaryOperator >
OutputIterator transform ( InputIterator first1, InputIterator last1,
OutputIterator result, UnaryOperator op ); template < class InputIterator1, class InputIterator2,
class OutputIterator, class BinaryOperator >
OutputIterator transform ( InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, OutputIterator result,
BinaryOperator binary_op ); 有如下两个使用原型,一个将迭代器区间[first,last)中元素,执行一元函数对象op操作,交换后的结果放在[result,result+(last-first))区间中。另一个将迭代器区间[first1,last1)的元素*i,依次与[first2,first2+(last-first))的元素*j,执行二元函数操作binary_op(*i,*j),交换结果放在[result,result+(last1-first1))。

set的比较类型,是less_equal,注意语义里面带了equal。

可以我看cplusplus网站上面定义的是less。

那还是以less为准吧。

http://www.cplusplus.com/reference/set/set/set/

用advance和distance可以把const iterator 转换成 iterator

其实是这样,iterator i = x.begin(); ci是const iterator

那么 advance(i, distance(i, ci));也就是把 i 移动到 ci 的位置。

对于 reverse_iterator类型,有一个base函数,能够返回对应的正向iterator信息,因为有的函数只支持正向iterator.

但是这个base返回的iterator,只能在insert的时候用,因为指向的reverse那个方向的前一个节点。

对于erase的时候,就不能用了,因为和reverse的指的不是一个节点。

算法

transform 很多地方都能够用到。

但是一定要注意,result的空间要大于等于待放入的内容。不然结果未定义。

比如:

尾部加入,用back_inserter

result.reserve(result.size()+values.size());

transform(value.begin(), value.end(),

back_inserter(result),

transfunc);

如果需要覆盖

if (result.size() < value.size()) {

result.resize(value.size())

}

transform(value.begin(), value.end(),

result.begin(),

transfunc);

partial_sort对于头部排序,很好用。

partial_sort(w.begin(), w.begin()+20, w.end(), comp);

而如果前面20个也不关心顺序,那么用

nth_element

用法:

nth_element(w.begin(), w.begin()+19, w.end(), comp);

partial_sort是不稳定的,nth_element,sort也没有提供稳定性。

partition函数用来分隔的。注意,partition是快排很好的工具,但是stl里面的partition因为第三个参数是一个bool函数,所以在快排的时候,不太好用。

bool函数为true的,放在partition的前面。

bool isOdd(int i) {return (i%)==;}

int ir[] = {, , , , , };
vector<int> x(ir, ir+sizeof(ir)/sizeof(int)); vector<int>::iterator itr = partition(x.begin(), x.end(), isOdd); copy(x.begin(), itr, ostream_iterator<int>(cout, " "));
cout<<endl;
copy(itr, x.end(), ostream_iterator<int>(cout, " "));

输出:

   

stack和vector都有 emplace函数,而stack其实是调用了底层容器的emplace_back,

都是C++11的。

The container is extended by inserting a new element at position. This new element is constructed in place using args as the arguments for its construction.

int main ()
{
std::vector<int> myvector = {,,}; auto it = myvector.emplace ( myvector.begin()+, );
myvector.emplace ( it, );
myvector.emplace ( myvector.end(), ); std::cout << "myvector contains:";
for (auto& x: myvector)
std::cout << ' ' << x;
std::cout << '\n'; return ;
} Output:
myvector contains:

effective stl读书笔记 & stl里面提供的算法 & emplace & ostream_iterator的更多相关文章

  1. Effective STL 读书笔记

    Effective STL 读书笔记 标签(空格分隔): 未分类 慎重选择容器类型 标准STL序列容器: vector.string.deque和list(双向列表). 标准STL管理容器: set. ...

  2. Effective STL读书笔记

    Effective STL 读书笔记 本篇文字用于总结在阅读<Effective STL>时的笔记心得,只记录书上描写的,但自己尚未熟练掌握的知识点,不记录通用.常识类的知识点. STL按 ...

  3. 机器学习实战 - 读书笔记(07) - 利用AdaBoost元算法提高分类性能

    前言 最近在看Peter Harrington写的"机器学习实战",这是我的学习笔记,这次是第7章 - 利用AdaBoost元算法提高分类性能. 核心思想 在使用某个特定的算法是, ...

  4. effective c++读书笔记(一)

    很早之前就听过这本书,找工作之前读一读.看了几页,个人感觉实在是生涩难懂,非常不符合中国人的思维方式.之前也有博主做过笔记,我来补充一些自己的理解. 我看有人记了笔记,还不错:http://www.3 ...

  5. Effective Java读书笔记完结啦

    Effective Java是一本经典的书, 很实用的Java进阶读物, 提供了各个方面的best practices. 最近终于做完了Effective Java的读书笔记, 发布出来与大家共享. ...

  6. 游戏人工智能 读书笔记 (四) AI算法简介——Ad-Hoc 行为编程

    本文内容包含以下章节: Chapter 2 AI Methods Chapter 2.1 General Notes 本书英文版: Artificial Intelligence and Games ...

  7. STL读书笔记

    vector - 会自动增长的数组 vector又称为向量数组,他是为了解决程序中定义的数组是不能动态改变大小这个缺点而出现的.一般程序实现是在类创建的时候同时创建一个定长数组,随着数据不断被写入,一 ...

  8. 【Effective C++读书笔记】序

    C++ 是一个难学易用的语言! [C++为什么难学?] C++的难学,不仅在其广博的语法,以及语法背后的语义,以及语义背后的深层思维,以及深层思维背后的对象模型: C++的难学还在于它提供了四种不同而 ...

  9. Effective C++读书笔记(转)

    第一部分 让自己习惯C++ 条款01:视C++为一个语言联邦 一.要点 ■ c++高效编程守则视状况而变化,取决于你使用c++的哪一部分. 二.扩展 将c++视为一个由相关语言组成的联邦而非单一语言会 ...

随机推荐

  1. ,典型递归问题-F(1025)mod 5 的值

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/ ...

  2. TCO14 1B L3: EagleInZoo, dp,tree

    题目:http://community.topcoder.com/stat?c=problem_statement&pm=13117&rd=15950 看到树,又是与节点有关,通常是d ...

  3. angularjs 事件向上向下传播

    <!DOCTYPE HTML> <html ng-app="myApp"> <head> <meta http-equiv="C ...

  4. rest_framework 序列化篇

    感谢alex和武沛齐老师 rest_framework中的序列化表示 from rest_framework import serializersclass RoleSerializer(serial ...

  5. [JZOJ4024] [佛山市选2015] 石子游戏 解题报告

    Description     Alice 和 Bob 总喜欢聚在一起玩游戏(T_T),今天他(她)们玩的是一款新型的取石子游戏.游戏一开始有N堆石子,Alice 和 Bob 轮流取出石子.在每次操作 ...

  6. 2.boost遍历数组容器

    #include <iostream> #include <string> #include<boost/array.hpp>//区别 using namespac ...

  7. MetaSploit攻击实例讲解------Metasploit自动化攻击(包括kali linux 2016.2(rolling) 和 BT5)

    不多说,直接上干货! 前期博客 Kali linux 2016.2(Rolling)里Metasploit连接(包括默认和自定义)的PostgreSQL数据库 Kali linux 2016.2(Ro ...

  8. SVN冲突的解决过程

    此文教程只是个人记录使用,不建议当教程!(估计新手也看得懵) 改完之后Ctrl+s保存就好.

  9. nodejs 通过 get获取数据修改redis数据

    如下代码是没有报错的正确代码 我通过https获取到数据 想用redis set一个键值存储 现在我掉入了回调陷阱res.on 里面接收到的数据是data 里面如果放入 client.on('conn ...

  10. benchmark测试PostgreSQL数据库OLTP性能

    1,安装配置PostgreSQL数据库 2,下载地址:http://sourceforge.net/projects/benchmarksql/?source=navbar Required:JDK7 ...