Effective STL读书摘要(一)

一直在用STL,认为对STL也有一些理解,比如比较函数怎么写,什么情况下用什么容器效率高,但是当你读过Effective STL之后才知道这远远不够,之前的代码还有很多可以优化的空间,下面我会罗列一些映像比较深的点,比较偏向代码因为这样可以方便以后的调用。这里是到Item29,余下的留下次看。

1) 检查容器是否为空

if(c.empty()){}   better than if(c.size()==0){}

2)如果能用批量操作函数就不要用循环来做

批量操作可以提高效率,要有能用批处理尽量批处理的习惯,这个在看intel的polygon库的时候深有体会,批量操作一共有四种

a) 批量构造  container::container( Inputlterator begin, Inputlterator end):

b) 批量插入 void container::insert(iterator position, Inputlterator begin, InputIterator end);

c) 批量删除 iterator container::erase(iterator begin, iterator end);

d) 批量赋值 void container::assign(lnputIterator begin, Inputlterator end);

3) 读取文件的简洁代码,如果文件格式很简单,可以直接用下面的代码读取

ifstream dataFile(" ints.dat"};

istream_iterator<int> dataBegin(dataFile);

istream_iterator<int> dataEnd;

list<int> data(dataBegin. dataEnd);

4)释放容器中内存的操作

struct DeleteObject {                   // templatization and base

// class removed here

template<typename T>                II templatization added here

void operator()(const T* ptr) const

{

delete ptr;

}

}

void doSomething()

{

deque<SpecialString*> dssp;

...

for_each( dssp.begin(), dssp.end(),

DeleteObject ());

}

5) 如何删除容器元素

这一点理解比较新,注意不同的容器要用不同的方式来删除

vector,string,deque:   c.erase( remove(c.begin(), c.end(), 1963), c.end());

list:                                c. remove(1963);

map:                             c.erase(1963);

条件删除,过去有写过一些文章关于list和vector如果一边遍历一边删除的,想想当初的做法很幼稚,现在有如下参考

bool badValue(int x); // returns whether x is "bad"

vector,list,string,deque:   c.erase(remove_if(c.begin(), c.end(), badValue), c.end());

map:                                    c.remove_if(badValue);

6) 关于STL的自构造内存管理

这是一个可以深入了解和优化的方向,作者讲得不够深入,但是提供了一些参考,可以去细读

7)reserve 空间

这个函数对效率的提高的过去深有体会,他可以有效的避免重复的内存分配和copy,这里再强调一下

8)STL容器怎么和传统的函数接口

vector<int> v;

void doSomething(const int* pInts, size_t numlnts);

doSomething(&v[0], v.size());

10)回收不必要的内存分配

我们知道STL vector内存增量分配的规则是倍数增加的,这就会导致后面可能有大量的内存的浪费,如何回收这些资源呢,过去我一直不知道怎么做,现在有如下小技巧可以实现

vector<Contestant>(contestants).swap(contestants);

string s;

string(s).swap(s);

11) 关于map的比较函数

我们知道map的比较函数就是一个< 是没有==的,那如何判断相等呢,比较tricky, s1<s2 && s2<s1 都是false就相等了,  这个过去我有体会

12)关于map的插入

我很喜欢用下面的方式插入,看起来很简单,但是效率不高

map<int, Widget> m;

m[1] = 1.50;

用下面的办法更好

m.insert(lntWidgetMap::value_type(1,1.50));

13) 使用for_each

struct Point {...);                                     // as before

class PointAverage:

public unary_function<Point, void> {                 // see Item 40

public:

PointAverage(): xSum(0), ySum(0), numPoints(0) {}

void operator()(const Point& p)

{

++numPoints;

xSum += p.x;

ySum += p.y;

}

Point result() const

{

return Point(xSum/numPoints, ySum/numPoints);

}

private:

size_t numPoints;

double xSum;

double ySum;

};

list<Point> Ip;

...

Point avg = for_each(lp.begin(), lp.end(), PointAverage()).result ;

时间: 2024-10-13 08:33:59

Effective STL读书摘要(一)的相关文章

&lt;Effective C++&gt;读书摘要--Resource Management&lt;一&gt;

1.除了内存资源以外,Other common resources include file descriptors, mutex locks, fonts and brushes in graphical user interfaces (GUIs), database connections, and network sockets. Regardless of the resource, it's important that it be released when you're fini

&lt;Effective C++&gt;读书摘要--Designs and Declarations&lt;三&gt;

<Item 22> Declare data members private 1.使数据成员private,保持了语法的一致性,client不会为访问一个数据成员是否需要使用括号进行函数调度,还是不使用括号直接访问成员而纠结. 2.使数据成员private,if you use functions to get or set its value, you can implement no access, read-only access, and read-write access. Heck

&lt;Effective C++&gt;读书摘要--Inheritance and Object-Oriented Design&lt;一&gt;

1. 3.

&lt;Effective C++&gt;读书摘要--Designs and Declarations&lt;二&gt;

<Item 20> Prefer pass-by-reference-to-const to pass-by-value 1.By default, C++ passes objects to and from functions by value (a characteristic it inherits from C). Unless you specify otherwise, function parameters are initialized with copies of the

&lt;Effective C++&gt;读书摘要--Templates and Generic Programming&lt;一&gt;

1.The initial motivation for C++ templates was straightforward: to make it possible to create type-safe containers like vector, list, and map. Ultimately, it was discovered that the C++ template mechanism is itself Turing-complete: it can be used to

&lt;Effective C++&gt;读书摘要--Ctors、Dtors and Assignment Operators&lt;二&gt;

<Item 9> Never call virtual functions during construction or destruction 1.you shouldn't call virtual functions during construction or destruction, because the calls won't do what you think, and if they did, you'd still be unhappy. If you're a recov

Effective C++读书笔记之十三:以对象管理资源

Item 13:Use objects to manage resources 假设我们使用一个用来塑膜投资行为的程序库,其中各式各样的投资类型继承自一个root class: class Investment { ... };  //"投资类型"继承体系中的root class 进一步假设,这个程序系通过一个工厂函数(工厂函数会"返回一个base class指针,指向新生成的derived class 对象),供应我们某特定的Investment对象: Investment

《Effective C++ 读书笔记》( 一 )

<Effective C++ 读书笔记> 条款01 : 视C++为一个语言联邦 将C++ 视为一个由相关语言组成的联邦而非单一语言. 我们可以将C ++ 看成四个部分 : 1. C 语言 . C ++ 中的区块 , 语句, 预处理器 , 内置数据类型 , 数组 , 指针等统统来自于C语言. 2. 面向对象的 C ++ . 类( 包括构造函数和析构函数 ) , 封装 , 继承 ,多态 , virtual 函数 ( 动态绑定 ) ... 等等 . 这一部分都是基于面向对象而设计的. 3. Temp

Effective STL 中文版(大全)

Effective STL 中文版(大全) 作者:winter 候捷说,对于STL,程序员有三个境界,开始是使用STL,然后是理解STL,最后是补充STL.Effective STL是一本非常好的书,帮助你更好的理解STL,其作者就是<Effective C++>一书的作者.如果你已经初步了解了STL的容器.迭代器.算法和函数,而又想更好的了解STL,那么<Effective STL>是你的最佳选择. 还有一部分没有找到链接,如果再找不到我会自己试着翻译一下:) 前言 容器 条款1