effective stl读书笔记 & stl里面提供的算法 & emplace & ostream_iterator
加锁和解锁,也可以在构造函数和析构函数里面,自动调用。
相等和等价的关系:等价是用在排序的时候,跟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的更多相关文章
- Effective STL 读书笔记
Effective STL 读书笔记 标签(空格分隔): 未分类 慎重选择容器类型 标准STL序列容器: vector.string.deque和list(双向列表). 标准STL管理容器: set. ...
- Effective STL读书笔记
Effective STL 读书笔记 本篇文字用于总结在阅读<Effective STL>时的笔记心得,只记录书上描写的,但自己尚未熟练掌握的知识点,不记录通用.常识类的知识点. STL按 ...
- 机器学习实战 - 读书笔记(07) - 利用AdaBoost元算法提高分类性能
前言 最近在看Peter Harrington写的"机器学习实战",这是我的学习笔记,这次是第7章 - 利用AdaBoost元算法提高分类性能. 核心思想 在使用某个特定的算法是, ...
- effective c++读书笔记(一)
很早之前就听过这本书,找工作之前读一读.看了几页,个人感觉实在是生涩难懂,非常不符合中国人的思维方式.之前也有博主做过笔记,我来补充一些自己的理解. 我看有人记了笔记,还不错:http://www.3 ...
- Effective Java读书笔记完结啦
Effective Java是一本经典的书, 很实用的Java进阶读物, 提供了各个方面的best practices. 最近终于做完了Effective Java的读书笔记, 发布出来与大家共享. ...
- 游戏人工智能 读书笔记 (四) AI算法简介——Ad-Hoc 行为编程
本文内容包含以下章节: Chapter 2 AI Methods Chapter 2.1 General Notes 本书英文版: Artificial Intelligence and Games ...
- STL读书笔记
vector - 会自动增长的数组 vector又称为向量数组,他是为了解决程序中定义的数组是不能动态改变大小这个缺点而出现的.一般程序实现是在类创建的时候同时创建一个定长数组,随着数据不断被写入,一 ...
- 【Effective C++读书笔记】序
C++ 是一个难学易用的语言! [C++为什么难学?] C++的难学,不仅在其广博的语法,以及语法背后的语义,以及语义背后的深层思维,以及深层思维背后的对象模型: C++的难学还在于它提供了四种不同而 ...
- Effective C++读书笔记(转)
第一部分 让自己习惯C++ 条款01:视C++为一个语言联邦 一.要点 ■ c++高效编程守则视状况而变化,取决于你使用c++的哪一部分. 二.扩展 将c++视为一个由相关语言组成的联邦而非单一语言会 ...
随机推荐
- hdu_1698线段树成段更新
#include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #d ...
- Wordpress 问题
迁移乱码 最近在做 wordpress 迁移,数据导入到服务器后,前后台都是乱码, phpMyAdmin 里的表数据就出现了乱码. 如果您也遇到和我一样的情况,本地使用 phpMyAdmin 导出 s ...
- centos 安装 aria2 webui 实现网页下载
centos aria2 webui 安装aria2 安装 rpmforge源 wget http://repository.it4i.cz/mirrors/repoforge/redhat/el6/ ...
- [Jsoi2010]连通数 bitset + Floyd
Code: #include<cstdio> #include<algorithm> #include<string> #include<cstring> ...
- CF981C(菊花图)
题目描述 RAMESS知道很多关于树的问题(无循环的无向连通图)! 他创建了一个新的有用的树的划分,但他不知道如何构造它,所以他请求你的帮助! 划分是从树上的边中分裂出一些简单的路径,使得每个两条路径 ...
- [洛谷P2245]星际导航
题目大意:有一张n点m边的带权无向图,和一些问题,每次询问两个点之间的路径的最大边权最小是多少. 解题思路:同NOIP2013货车运输,只是数据增大,大变成小,小变成大了而已.所以具体思路见货车运输. ...
- 紫书 例题 10-17 UVa 1639(数学期望+分数处理+处理溢出)
设当前有k个,那么也就是说拿到其他图案的可能是(n-k)/n 那么要拿到一个就要拿n/(n-k)次 所以答案就是n(1/n + 1/(n-1) ......1/2 + 1 / 1) 看起来很简单,但是 ...
- Git 服务器更换了IP的解决方法
1.找到项目根目录中的.git文件夹 2..git文件夹里有一个config文件 3.用记事本打开后,修改为服务器的新ip就行了.
- Maven学习总结(21)——Maven常用的几个核心概念
在使用Maven的过程中,经常会遇到几个核心的概念,准确的理解这些概念将会有莫大的帮助. 1. POM(Project Object Model)项目对象模型 POM 与 Java 代码实现了解耦,当 ...
- AJAX--XMLHttpRequest五步使使用方法
传统浏览方式和AJAX方式的不同 多数Web应用程序都使用请求/响应模型从server上获得完整的HTML页面.经常是点击一个button,等待server对应,在点击还有一个button.然后在等待 ...