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返回是void,但是我在vc6上试过是有返回值的,跟list的erase一样;