effective STL

Posted sofard

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了effective STL相关的知识,希望对你有一定的参考价值。

void test()
{
//条款4 使用empty()判断空
//条款5 使用assign赋值,insert赋值
vector<int> v1(10.5), v2(20.7);
v1.clear();
//copy(v2.begin() + v2.size() / 2, v2.end(), back_inserter(v1));

v1.assign(v2.begin() + v2.size() / 2, v2.end());
v1.insert(v1.begin(), v2.begin(), v2.end());

//条款6 拷贝int文件到list中
ifstream dataFie("ints.dat");
//list<int> data(istream_iterator<int>(dataFile), istream_iterator<int>()); //什么都不会做?声明了个函数data,第一个参数是dataFile,第二个参数是 函数指针
list<int> data( (istream_iterator<int>(dataFie)), istream_iterator<int>());//用括号括住形式参数是非法的,但是括住实参是合法的


//下面3个同意义
int f(double(d)); //完整参数
int f(double d);
int f(double); //省略参数名

//下面3个同意义
int g(double(*pf)());//g带有一个函数指针为参数
int g(double pf()); //pf是一个函数指针
int g(double());//参数名省略

//条款7 容器中有指针时,new出来的对象 需要手动释放,即容器只负责释放自己的内容

vector<line_iterator *> lwp;
//for crash safe
{
//使用智能指针 shared_ptr代替指针。。。妈蛋
}
for_each(lwp.begin(), lwp.end(), DeleteObject<line_iterator>());//需要指定删除对象,当成员是非虚析构函数,一不留神 容易弄错内存泄漏
for_each(lwp.begin(), lwp.end(), DeleteObject_Init());//编译器自动推导 析构对象

//条款8 放弃auto_ptr

//条款9 删除的时候 如何选择
//Container<int> c
//连续内存容器
vector/* deque string */<int> c; //remove只是放在尾部,不删除
c.erase(remove(c.begin(), c.end(), 1963), c.end());
//链表
list<int> c2;
c2.remove(1963);

//关联容器 set multiset map multimap
set<int> s1;
s1.erase(1963);

//如果把1963 替换为函数 bool isbad(int i) 呢
c.erase(remove_if(c.begin(), c.end(), isbad), c.end());
c2.remove_if(isbad);
for (set<int>::iterator i = s1.begin(); i != s1.end(); )
{
if (isbad(*i)) {
s1.erase(i++); //删除之前i指向下一个
}
else
++i;
}

//条款10,11分配器 暂时看不懂

//条款12 stl线程安全的问题
//template <typename T>
class Lock
{
Lock(const T)
{
//lock
}
~Lock()
{
//un lock

}
};
//条款13 vector 和 string 替代数组,不使用数组
//条款14 vector 和string 根据需求提前reverse(将容量括到至少n大小),降低重新分配内存概率,或者开始分配很大,后面数据稳定后修剪掉多余的部分

//条款15 string 实现的一些方式

//条款16 C风格的api的使用,vector与string 可以很好的融入C风格api............可以作为其他的容器使用C风格api的桥梁

//条款17 使用"交换技巧"来修整过剩容量 vector<int>(aim_vector).swap(aim_vector)

//条款18 vector<bool> 使用了bit位优化位置,不支持很多容器操作,应使用bitset

//条款19 比较函数使关联容器有序, 但比较的是等价不是相等

//条款20 关联容器中存放指针是,按照指针排序,必须使用仿函数(类),来自定义比较函数,使元素有序

//条款21 标准关联容器中,相等的值永远返回false,避免插入消耗cpu,破坏有序结构

//条款22 避免原地修改set和multiset的键值

map<int, string> m;
// m.begin()->first = 10; 只读无法修改,若需要修改怎么办。。
//map 的键和值是分开的,键没法修改
set<int> k;
//k.begin(). 100;
//set 的键和值相同,但是排序方式可能是键里面的一部分,可以修改键,但是要保证不修改影响到排序的一部分







































































以上是关于effective STL的主要内容,如果未能解决你的问题,请参考以下文章

如何编写自定义函数以从 `effects::Effect()` 中提取预测

DirectX11第四篇 Effects框架

tooltip-effect为啥效果出不来

未调用 @Effect() 中的服务

使用 Effect Hook

Declarative Effects --- redux-saga