2012年12月12日

Windows CE系统生成随机数字符串

摘要: srand函数用于初始化随机数生成器,rand函数用于产生随机数。srand的参数称为随机数种子,要确保rand函数产生真正的随机数(每次生成的随机数不同),随机数种子就要设置为不同的值。(In order to generate random-like numbers, srand is usually initialized to some distinctive value)通常以系统时间作为随机数种子,最常用的方式是:srand(time(NULL));,但Windows CE编程时,c库不支持time函数,所以这里以GetTickCount代替。另外注意下面函数中的for循环,由于f 阅读全文

posted @ 2012-12-12 07:51 zhuyf87 阅读(1055) 评论(0) 推荐(0) 编辑

2012年12月11日

Windows Mobile系统弹出输入法时,自动调整窗口显示

摘要: windows mobile系统自带的输入法没有标题栏,用户没有办法移动它的显示位置。如果对话框的底部,有需要输入的编辑框,就会被弹出的输入法遮挡住,这样用户无法实时看到自己输入的内容。参考mobile自带的系统程序,一般可以做成下面这种效果。也就是弹出输入法时,自动给窗口添加一个滚动条。用户可以通过滚动条调整界面的显示。当关闭输入法时,将滚动条去掉,同时窗口恢复到弹出输入法之前的默认显示。下面介绍如何实现这种功能。首先需要在系统“弹出输入法”和“关闭输入法”时,能够获得一个通知。这可以通过响应WM_SETTINGCHANGE消息来完成。当执行到自定义的WM_SETTINGCHANGE消息响应 阅读全文

posted @ 2012-12-11 11:11 zhuyf87 阅读(908) 评论(1) 推荐(0) 编辑

2012年12月10日

私房STL之deque

摘要: 原文地址:捣乱小子http://www.daoluan.net/一句话deque:deque是双端队列,它的空间构造并非一个vector式的长数组,而是“分段存储,整体维护”的方式;STL允许在deque中任意位置操作元素(删除添加)(这超出了deque的概念,最原始的deque将元素操作限定在队列两端),允许遍历,允许随机访问(这是假象);我们将看到,deque将是STL中stack和queue的幕后功臣,对deque做适当的修正,便可以实现stack和queue。deque的迭代器deque的迭代器与一般的迭代器不同,并不是vector或者list的普通指针式迭代器,有必要写下。..... 阅读全文

posted @ 2012-12-10 07:19 zhuyf87 阅读(571) 评论(0) 推荐(0) 编辑

2012年12月9日

deque与vector的主要区别

摘要: deque与vector非常相似。它也采用动态数组管理元素,提供随机存取,有着和vector几乎一样的接口。不同的是deque的动态数组头尾都开放,因此能在头尾两端进行快速安插和删除。deque通常实作为一组独立区块,第一区块朝某方向扩展,最后一个区块朝另一个方向扩展。deque与vector的主要不同之处在于:1. 两端都能快速安插和删除元素,这些操作可以在分期摊还的常数时间(amortized constant time)内完成。2. 元素的存取和迭代器的动作比vector稍慢。3. 迭代器需要在不同区块间跳转,所以它非一般指针。4. 因为deque使用不止一块内存(而vector必须使用 阅读全文

posted @ 2012-12-09 12:56 zhuyf87 阅读(15533) 评论(0) 推荐(4) 编辑

2012年12月8日

使用vector需要注意的要点

摘要: vector的元素类别T,必须具备assignable和copyable两个性质。vector的容量很重要:1. 一旦内存重新配置,和vector元素相关的所有references、pointers、iterators都会失效。2. 内存重新分配很耗时间。所以,如果程序管理了和vector元素相关的references、pointers、iterators或执行速度至关重要,就必须考虑容量问题。可以使用reserve()保留适当容量,避免一再重新分配内存。可以利用如下语句缩减容量:std::vector<T>(v).swap(v);c1 = c2:将c2的全部元素赋值给c1c.as 阅读全文

posted @ 2012-12-08 21:32 zhuyf87 阅读(1478) 评论(0) 推荐(0) 编辑

iterator迭代循环的风格问题

摘要: for (vector<int>::iterator i = v.begin(); i < v.end(); i++) { cout << *i << endl;}这个循环本身没有明显错误,存在的只是一些风格上的问题。(1)尽量做到const正确性。如果迭代器没有用来修改vector中的元素,应该改用const_iterator。(2)尽量使用“!=”而不是“<”来比较两个迭代器。因为“<”只对随机访问迭代器有效(例如,std::list的迭代器并不支持“<”),而“!=”对于任何迭代器都有效。所以应该把使用“!=”比较迭代器作为日常 阅读全文

posted @ 2012-12-08 08:51 zhuyf87 阅读(327) 评论(0) 推荐(0) 编辑

2012年12月7日

size resize与capacity reserve之间的区别

摘要: 大小(size,跟resize相对应)与容量(capacity,与reserve相对应)之间有很大的区别:size表明容器中目前实际有多少个元素,resize会在容器的尾部添加或删除一些元素,使容器达到指定的大小。这两个函数对list、vector、deque都适用,对其它容器不适用。capacity表明最少添加多少个元素才会导致容器重新分配内存,reserve会使容器的内部缓冲区扩充至一个更大的容量,以确保至少满足reserve的参数所指出的空间大小。这两个函数仅对vector适用。v.reserve(2);执行之后,可以确保v.capacity() >= 2;(注意不是v.capac 阅读全文

posted @ 2012-12-07 12:39 zhuyf87 阅读(489) 评论(0) 推荐(0) 编辑

2012年12月6日

vector中v[i]与v.at(i)的区别

摘要: void f(vector<int> &v){ v[0]; // A v.at[0]; // B}如果v非空,A行和B行没有任何区别。如果v为空,B行会抛出std::out_of_range异常,A行的行为未定义。c++标准不要求vector<T>::operator[]进行下标越界检查,原因是为了效率,总是强制下标越界检查会增加程序的性能开销。设计vector是用来代替内置数组的,所以效率问题也应该考虑。不过使用operator[]就要自己承担越界风险了。如果需要下标越界检查,请使用at。 阅读全文

posted @ 2012-12-06 18:15 zhuyf87 阅读(13270) 评论(0) 推荐(1) 编辑

使用“swap技巧”除去多余的容量

摘要: 为了避免vector占用不再需要的内存,需要有一种方法把它的容量(capacity)缩减到当前需要的数量。方法就是:vector<ElemType>(v).swap(v);。vector<ElemType>(v)创建一个临时变量,它是v的一个拷贝。vector的拷贝构造函数只为所拷贝的元素分配所需要的内存,所以这个临时变量不会有多余的容量。然后将这个临时变量与v做swap操作,在这之后v就具有了被去除之后的容量,即原先临时变量的容量。临时变量会具有原先v的容量,随后临时变量被析构,从而释放内存。测试程序及输出(vc2008):vector<int> v;v. 阅读全文

posted @ 2012-12-06 16:40 zhuyf87 阅读(677) 评论(0) 推荐(0) 编辑

如何把vector和string数据传递给旧的api

摘要: 如果决定使用vector和string代替传统的数组,就要考虑如何与旧的C API和平共处。如果有一个vector v,同时需要一个指向v中数据的指针,从而把v中的数据当做数组来对待。可以使用&v[0]来得到这样的指针,&v[0]会指向v中的第一个元素,并且c++标准要求vector中的元素存储在连续的内存中,就像数组一样。void do_something(const int * ints, size_t num_ints);if (!v.empty()) do_something(&v[0], v.size());不要使用v.begin()来代替&v[0], 阅读全文

posted @ 2012-12-06 14:26 zhuyf87 阅读(701) 评论(0) 推荐(0) 编辑

导航