C++ Primer Plus 16章

size_type 依赖于具体实现 vs2010中为一个 unsigned int, 所以在使用 string.length 等方法时要注意无符号,有符号的转换


异常可能导致 delete 不执行,导致内存泄露


//auto_ptr
template<typename X> class auto_ptr{
public:
explicit auto_ptr(X* p = 0) throw(); //1意味着构造函数不引发异常? 2构造函数是显示的
};
auto_ptr<string> ps(new string);


注意事项:

auto_ptr<int> pi (new int[200]); //编译不会出错,但是会导致 delete 作用于 delete[]
2
string vacation("testtest");
auto_ptr ps (&vacation); //编译不会出错,但是会导致 delete 作用于 非堆(new) 内存


3 auto_ptr 所有权转换
auto_ptr<string> ps (new string("test"));
auto_ptr<string> vocation;
vocation = ps; //这里并不会让 vocation 与 ps 都指向 "test", 因为这会导致 "test" 会删除两次

要避免这个问题,可以有以下方法
1 定义赋值操作符,执行深复制,使其完全成为两个对象
2 建立所有权(ownership)概念,对于一个特定对象,只能有一个智能指针可以拥有它,这是auto_ptr的策略
3 创建更高级的智能的指针,跟踪引用特定对象的智能指针数,即引用计数,只有当最后一个指针过期时,delete才会被调用




NOTE:auto_ptr只是STL中的智能指针之一,auto_ptr所做的事情,就是动态分配对象以及当对象不再需要时自动执行清理。
ex:
1 普通方法,需要时时注意 delete pTC
void foo(bool isThrow)  
{  
     TC *pTC = new TC;          
     try  
     {  
if(isThrow)  
throw "haha";  
     }  
     catch(const char* e)  
     {  
delete pTC;         
        throw;  
     }  
     delete pTC;              
}  
2 智能指针方法
void foo(bool isThrow)  
{  
     auto_ptr<TC> pTC(new TC);    
     try  
     {  
if(isThrow)  
throw "haha";  
     }  
     catch(const char* e)  
     {  
throw;  
     }  
//不用注意 delete TC了,因为已经托管给pTC了, pTC是一个局部变量,其在函数结束后会自动销毁并调用析构函数,同时会自动delte TC
}  


//vector
.begin() 迭代器指向vector的第一个元素
.end() 迭代器指向vector的最后一个元素的后面那个元素


//对 vector 的其他操作
1 for_each(); //可以用于任何容器
template <class InputIterator, class Function>
   Function for_each (InputIterator first, InputIterator last, Function fn);


vector<Review>::iterator pr;
for(pr = books.begin(), pr != books.end(); pr++)
ShowReview(*pr);
->
for_each(books.begin, books.end(), ShowReview);




2 random_shuffle() 随机排列区间内数据 //只能用于可随机访问的容器
random_shuffle(books.begin(), books.end());


3 sort(); 排序 //只能用于可随机访问的容器
3.1 sort(coolstuff.begin(), coolstuff.end()); //使用内置(重载操作符) operator< 进行比较
3.2 sort(books.begin(), books.end(), WorseThan); //使用WorseThan进行比较
bool WorseThan(const Review & r1, const Review & r2)
{
if(r1.rating < r2. rating)
return true; //return true 表示r1 r2 的顺序是正确的
else
return false; //return flase 表示r1 r2 的顺序是错误的 应该是 r2 r1
}


//STL的泛型编程技术(generic programming)(不同于OOP)
1 迭代器
vector<double>::iterator pr;
list<double>::iterator pr;

2 迭代器类型
1 输入迭代器
2 输出迭代器
3 正向迭代器
4 双向迭代器
5 随机访问迭代器 
//...看不明白了...


3 容器种类


swquenec(序列)
- deque
双端序列(实现与vector类似),但是在头部插入和删除元素为线性时间
- list
双向链表,删除,添加元素为链表形式,但是不能随机访问
- queue
队列,不允许随机访问,甚至不允许遍历
- priority_queue
??
- stack
栈,底层通常用vector来实现
- vector
提供随机访问;
在尾部添加和删除元素是固定时间,头部或中间插入和删除元素为线性时间;
可反转容器

assicative container(联合容器)
-set
-multiset
联合集合,可反转,可排序,关键字唯一
set<string> A;
-map
-multimap
联合集合,可反转,键值对
map<int , string> codes;
pair<int, string> item(123, "Angeles");
codes.insert(item);
codes.insert(pair<int, string>(123, "Angeles"));

4 函数对象
class Linear
{
//...
double operator()(doublex){return y0 + slope * x;} //重载 operator() 操作符
//...
}

//太晕,使用STL源码解析来学习
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值