容器
A鱼翔浅底A
每天进步一点点...
QQ:1106533113
展开
-
容器:用empty来代替检查size()是否为0
对于任意容器c,写下if (c.size() == 0)...本质上等价于写下if (c.empty())...这就是例子。你可能会奇怪为什么一个构造会比另一个好,特别是事实上empty的典型实现是一个返回size是否返回0的内联函数。你应该首选empty的构造,而且理由很简单:对于所有的标准容器,empty是一个常数时间的操作,但对于一些list实现,si原创 2016-12-12 10:20:39 · 530 阅读 · 0 评论 -
需要无格式一个一个字符输入时考虑使用istreambuf_iterator
先让我来吹嘘一下:这种技术2行代码就可以读到文件所有内容哦第一种方式:#include #include ifstream inputFile("interestingData.txt");// 把inputFile读入fileDatastring fileData( ( istream_iterator(inputFile) ), istream_ite原创 2016-12-13 17:00:48 · 1692 阅读 · 0 评论 -
STL部分排序
一、我们先总结一下排序选择:● 如果你需要在vector、string、deque或数组上进行完全排序,你可以使用sort或stable_sort。● 如果你有一个vector、string、deque或数组,你只需要排序前n个元素,应该用partial_sort。● 如果你有一个vector、string、deque或数组,你需要鉴别出第n原创 2016-12-13 18:34:30 · 563 阅读 · 0 评论 -
STL的remove算法详解
一、remove的声明:templateForwardIterator remove( ForwardIterator first, ForwardIterator last, const T& value)remove结论:remove并不“真的”删除东西,因为它做不到。注意:list::remove除外二、remove详细过程1、举例:vec原创 2016-12-14 10:25:54 · 999 阅读 · 0 评论 -
避免在指针的容器上使用类似remove的算法造成的内存泄漏
一、问题引入你在管理一堆动态分配的Widgets,每一个都可能通过检验,你把结果指针保存在一个vector中:class Widget{public: ...// 这个Widget是否通过检验 bool isCertified() const; ...};// 建立一个vector然后用vector v原创 2016-12-14 10:58:51 · 410 阅读 · 0 评论 -
STL实现简单的忽略大小写字 符串比较
利用STL名字第二长的算法----lexicographical_compare// 返回在忽略大小写的情况下c1是否在c2前面;bool ciCharLess(char c1, char c2) {原创 2016-12-14 11:26:47 · 735 阅读 · 0 评论 -
用accumulate或for_each来统计区间
一、accumulate用法1、求一个区间的和、积(默认)// 建立一个list,放一些double进去list ld; ... // 计算它们的和,从0.0开始 double原创 2016-12-14 15:23:31 · 383 阅读 · 0 评论 -
仿函数类:合理处理大对象和多态
仿函数类的设计原则:数据量小,单态 // 用于修改的BPFC的新实现类template class BPFCImpl : public unary_function { private:// 以前在BPFC里的所有数据现在在这里 Widget w;原创 2016-12-14 15:51:33 · 305 阅读 · 0 评论 -
STL: 用纯函数做判断式
一、必要的概念● 判断式是返回bool(或者其他可以隐式转化为bool的东西)。判断式在STL中广泛使用。标准关联容器的比较函数是判断式,判断式函数常常作为参数传递给算法,比如find_if和多种排序算法。● 纯函数是返回值只依赖于参数的函数。如果f是一个纯函数,x和y是对象,f(x, y)的返回值仅当x或y的值改变的时候才会改变。 ● 一个判断式类原创 2016-12-21 11:49:08 · 335 阅读 · 0 评论 -
map/multimap 排序操作
一、背景引入正如所有了解零件(Widget)的人所知道的,Widget有重量和最高速度class Widget {public: ... size_t weight() const; size_t maxSpeed() const; ...};此外众所周知的是给Widget排序的自然方法是按原创 2016-12-23 14:39:57 · 510 阅读 · 0 评论 -
使用ptr_fun、mem_fun和mem_fun_ref
一、背景引入如果我有一个函数f和一个对象x,我希望在x上调用f,而且我在x的成员函数之外。C++给我三种不同的语法来实现这个调用:// 语法#1:当f是一个非成员函数f(x); // 语法#2:当f是一个成员函数 ,而且x是一个对象或一个对象的引用 x.f(); // 语法#3:当f是一个成员函数,而且p原创 2016-12-21 16:17:16 · 342 阅读 · 0 评论 -
reverse_iterator的插入和删除操作
关于标准容器的4种迭代器的转化,我前面的博客已经提到了,可以参考一下一、base成员函数的用法举个例子,看一下这段代码,我们首先把从数字1-5放进一个vector中,然后产生一个指向3的reverse_iterator,并且通过reverse_iterator的base初始化一个iterator:vector v;v.reserve(5);原创 2016-12-13 16:07:34 · 1427 阅读 · 0 评论 -
标准容器类提供的四种迭代器类型
四种类型分别为:iterator、const_iterator、reverse_iterator、const_reverse_iterator对于container而言,iterator的作用相当于T*,而const_iterator则相当于const T*(你可能也见过T const*这样的写法:)。增加一个iterator或者const_iterator可以在一个从容器开头趋向尾部原创 2016-12-13 15:14:03 · 455 阅读 · 0 评论 -
尽量使用区间成员函数代替它们的单元素兄弟
尽量使用区间成员函数来代替单元素兄弟的三个可靠的论点:1、区间成员函数更容易写,2、它们更清楚地表达你的意图,3、而且它们提供了更高的性能。快!给定两个vector,v1和v2,使v1的内容和v2的后半部分一样的最简单方式是什么?不要为“当v2有偶数个元素时才有一半”而烦恼,只要做一些合理的东西。时间到!如果你的答案是v1.assign(v2.begin() + v原创 2016-12-12 11:26:05 · 311 阅读 · 0 评论 -
包含指针的容器delete方式
如何正确处理包含指针的容器是值得探究的。一、常见的方式,直接手动deletevoid doSomething(){ vector vwp; for (int i = 0; i vwp.push_back(new Widget); ... for (vector:原创 2016-12-12 15:08:52 · 612 阅读 · 0 评论 -
永不建立auto_ptr的容器
请注意拷贝auto_ptr的独特性!auto_ptr pw1(new Widget); // pw1指向一个Widget auto_ptr pw2(pw1); // pw2指向pw1的Widget; // pw1被设为NULL。(Widget的原创 2016-12-12 15:27:01 · 363 阅读 · 0 评论 -
删除容器对象的几种方式
●去除一个容器中有特定值的所有对象: 1、如果容器是vector、string或deque,使用erase-remove惯用法。Container c; c.erase(remove(c.begin(), c.end(), 1963), // 当c是vector、string c.end());原创 2016-12-12 15:50:10 · 1118 阅读 · 0 评论 -
如何将vector 和 string 传递给 类C的API
一、vectorvector v;对于这样的类C的API: void doSomething(const int* pInts, size_t numInts);if (!v.empty()) {doSomething(&v[0], v.size());}如果你在一个不好的环境中,你可能会碰到一些半吊子的人物,他们会告诉你说可以用v.begin()代替&v[原创 2016-12-12 18:11:03 · 287 阅读 · 0 评论 -
使用“交换技巧”来修整容器过剩容量
假设你正在为TV游戏秀《Give Me Lots Of Money — Now!》写支持软件,而且你要跟踪可能的竞争者,你把它们保存在一个vector中:class Contestant {...};vector contestants;当这个秀需要一个新的竞争者时,它将被申请者淹没,你的vector很快获得很多元素。但是秀的制作人只要预期的游戏者,一个相对少数符合原创 2016-12-12 18:51:42 · 315 阅读 · 0 评论 -
为指针的关联容器指定比较类型
一、现象描述假定你有一个string*指针的set,你把一些动物的名字插入进set:set ssp; // ssp = “set of string ptrs”ssp.insert(new string("Anteater"));ssp.insert(new string("Wombat")原创 2016-12-12 20:24:50 · 382 阅读 · 0 评论 -
关联容器:永远让比较函数对相等的值返回false
一、问题引入让我向你展示一些比较酷的东西。建立一个set,比较类型用less_equal,然后插入一个10:// s以“set > s; s.insert(10); 现在尝试再插入一次10:s.insert(10) 对于这个insert的调用,set必须先要判断出10是否已经位于其中了。 我们知道它是,但set可是木头木脑的,它必须执行检查原创 2016-12-13 10:12:04 · 654 阅读 · 0 评论 -
避免原地修改set和multiset的键而修改其值
一、问题引入正如所有标准关联容器,set和multiset保持它们的元素有序,这些容器的正确行为依赖于它们保持有序。 如果你改了关联容器里的一个元素的值(例如,把10变为1000),新值可能不在正确的位置,而且那将破坏容器的有序性。很简单,是吗?这对于map和multimap特别简单,因为试图改变这些容器里的一个键值的程序将不能编译:map m;...// 错误!map原创 2016-12-13 11:19:14 · 978 阅读 · 0 评论 -
提高map[key]=value的效率
当关乎效率时应该在map::operator[]和map-insert之间仔细选择我们知道 这个表达式 m[k] = v; 检查键k是否已经在map里。如果不,就添加上,以v作为它的对应值。如果k已经在map里,它的关联值被更新成v。举例一:考虑插入一个新值这个语句m[1] = 1.50; 功能上等价于这个:typedef map原创 2016-12-13 14:44:47 · 1336 阅读 · 0 评论 -
容器搜索算法的选择
一、总体介绍在count、find、binary_search、lower_bound、upper_bound和equal_range中做出选择很简单。当你调用时,选择算法还是成员函数可以给你需要的行为和性能,而且是最少的工作。按照这个建议做(或参考上面表格),你就不会再有困惑。原创 2016-12-23 16:35:58 · 392 阅读 · 0 评论