失业在家的学习笔记-第二天

1.调试

一篇VC6.0的调试讲解,很详细http://blog.csdn.net/custqi/article/details/6452970

使用gdb调试,在编译文件的时候要使用-g选项添加调试信息,比如gcc -g 001.c -o test;gdb test

一篇讲解gdb调试的文章http://blog.csdn.net/haoel/article/details/2879


2.今天看《编程之美》1.5节,里面提到为了降低空间复杂度,使用变长数组代替原来的固定长度数组;

对于变长数组,我的理解是用vector定义一个空的变量,然后有需要的时候就往里面insert,不需要的变量就erase掉;

但是这样的话不如用list实现,毕竟有很多插入删除操作。


3.既然提到了STL,总结一下使用容器的注意事项,参考www.cplusplus.com

(1)vector是有容量概念的,当往里面insert或push_back超过容量的时候会导致重新分配内存,这时候所有的迭代器都失效;

对vector做insert和erase操作,指向该位置和该位置往后所有的迭代器都会失效,比如下面

for(vector<int>::iterator iter=var.begin();iter!=var.end();++iter)

{
if(*iter==4)
{
iter=var.erase(iter);
iter--;
}
}

要重新对iter赋值,并且把迭代器往回退一个,保证循环能遍历到所有节点;

vector的push_back和pop_back效率比insert和erase高;

(2)list的erase操作只会让指向被删除元素的迭代器失效,其他迭代器依然有效

(3)map可以直接用这种方式插入

map<char,int> first;
first['a']=10;

也可以用
pair<iterator,bool> insert (const value_type& val);
std::map<char,int> mymap;
 mymap.insert ( std::pair<char,int>('a',100) );
因为map里的key是唯一的,所以当插入相同的key时,这个函数的返回值是false,并且迭代器指向已存在的元素,如下:
std::pair<std::map<char,int>::iterator,bool> ret;
  ret = mymap.insert ( std::pair<char,int>('z',500) );
if (ret.second==false) {
    std::cout << "element 'z' already existed";
    std::cout << " with a value of " << ret.first->second << '\n';
}
另外map里的元素是按key排序的,下面这个里的第一个参数只起提示作用,

with hint (2)
iterator insert (iterator position, const value_type& val);
map的erase一样只会使指向被删除元素的迭代器失效,特殊的地方在于,它除了可以使用迭代器做参数外,还能用key做参数;
看这个网站上map的erase返回是void,但是我在vc6上试过是有返回值的,跟list的erase一样;





 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值