What are your favorite C++ idioms?
本问题已经有最佳答案,请猛点这里访问。
Possible Duplicate:
What are your favorite C++ Coding Style idioms
亲爱的C++粉丝们,
你能列举一下你最喜欢的C++习语吗?最好列出那些有用但不知名的。
首先,我放了一个:
为了避免冗长的重复
1 | #define LOOP(n) for (size_t _i = 0; _i < n; ++_i) |
_我是bind使用的占位符。
所以我可以写:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | vector<int> coll(100); LOOP (100) { coll[_i] = _i; } LOOP (100) { auto a = _i; LOOP (100) { auto b = _i; cout << a << b; } } |
瑞伊在我的名单上。有很多情况下,只要它能派上用场…
最有用的是像AndreiAlexandrescu的libloki这样的通用实现。
斯芬纳
好问题,但我认为你的例子不好!你的EDCOX1×0的宏不会使任何东西变得更清晰——它实际上隐藏了那些不使用你的宏的程序员的意图,它甚至看起来不像C++——我对你的片段的第一反应是"甚至C++"吗?或者"普通的
不管怎样,添加一个实际答案——我最喜欢的C++语言中的习语是UpQuyjpTR的向量:
1 | std::vector<std::unique_ptr<T>> my_container; |
它具有以下优点——本质上是指针的安全向量:
- 它在O(1)时间内提供随机访问
- 即使在重新分配元素时,元素也不会在内存中移动(因此您可以安全地获取
T 的地址并存储它们) - 快速完成排序之类的任务(只是改变一些指针,而不是复制重量级对象)
- 异常安全并有助于防止内存泄漏-元素上的
erase() 还释放内存 - 灵活-您可以将cx1(5)个指针从容器中取出并放在其他地方。
它确实有一个或两个缺点:
- 每个元素都分配在堆上,如果添加/删除大量元素,加上在内存中丢失缓存位置的元素可能相距很远,这可能会影响性能。
- 迭代需要两个间接的
(*i)->member 语法-但我不认为这有什么大不了的
然而,特别是对于重量级物体,我认为它几乎是一个理想的容器。
如果需要确切的生存期范围,则RAII+打开嵌套块:
1 2 3 4 5 6 7 8 9 10 | Lock lock(this); ResourceHolder resource(findResource()); WorkerHolder worker(resource); if (!worker) return false; // frees the resource and unlocks the lock { WorkAssignment assignment(worker); assignment.Execute(); } // assignment cleaned up even in case of exception ... |