今天写快速排序,碰到一个问题:使用了下面的宏:
- #define SWAP(a,b) \
- int temp = a; \
- a = b; \
- b = temp
咋看没有问题,但是在使用时a,不是一个值而是一个表达式
这样在编译器预处理的时候会展开为
- int temp = v[++m]; v[++m] = v[i]; v[i] = temp;
m被加了两次,导致错误。
对于宏的使用,如果不打算改变宏参数的值,可以在宏开始的地方,保存一边宏的值,避免重复计算,例如
- #define MAX(a,b) \
- a > b? a: b
如果传入的a,b时fa().fb(),那么至少有一个函数计算了两次,导致额外的计算。
完整的代码如下
- #include <vector>
- #include <iostream>
- using std::vector;
- using std::cout;
- using std::endl;
- #define SWAP(a,b) \
- int temp = a; \
- a = b; \
- b = temp
- void sort(vector<int> & v, int beg, int end) {
- if (beg >= end) {
- return;
- }
- int flag = v[beg];
- int m = beg;
- for (int i = beg; i<=end; ++i) {
- if (v[i] < flag) {
- ++m;
- SWAP(v[m], v[i]);
- }
- }
- SWAP(v[m], v[beg]);
- sort(v, beg, m-1);
- sort(v, m+1, end);
-
- return;
- }
-
- void sort(vector<int> &v) {
- int size = v.size();
- sort(v, 0, size - 1);
- }
-
- template<class T>
- int container_print(const T &c) {
- typename T::const_iterator beg = c.begin();
- typename T::const_iterator end = c.end();
- for (;beg != end; ++beg) {
- cout << *beg << ",";
- }
- return 0;
- }
-
- int main() {
- vector<int> v;
- v.push_back(10);
- v.push_back(20);
- v.push_back(-20);
- v.push_back(-30);
- v.push_back(-50);
- v.push_back(50);
- v.push_back(-10);
- v.push_back(-9);
- v.push_back(-8);
- v.push_back(-7);
- container_print(v);
- cout << endl;
-
- sort(v);
- container_print(v);
- cout << endl;
- }