你最喜欢的C++惯用法是什么?

3

可能的重复:
你最喜欢的C++编码风格习惯是什么

亲爱的C++粉丝们,

你能否在这里列出你最喜欢的C++习惯用法?最好列出那些有用但不太为人知的。

首先,我分享一个我的习惯用法:

为了避免繁琐的重复操作 for (size_t i = 0; i < n; ++i) {...} ,我使用像这样的宏:

#define LOOP(n) for (size_t _i = 0; _i < n; ++_i)

_i是一个占位符,因为bind使用它。

所以我可以写:

vector<int> coll(100);
LOOP (100)
{
    coll[_i] = _i;
}

LOOP (100)
{
    auto a = _i;
    LOOP (100)
    {
        auto b = _i;
        cout << a << b;
    }
}

6
针对你的例子:这是你的 IDE 应该帮你处理的问题,而不是使用晦涩的宏。 - Mchl
9
好问题给你点赞,但是糟糕的例子要扣分,扣回去了 :) - NPE
1
可能有很多重复的内容:https://dev59.com/2XI-5IYBdhLWcg3wn526,http://stackoverflow.com/questions/2096515/listing-elegant-c-idioms-closed,https://dev59.com/_HE95IYBdhLWcg3wXcnd。OP的例子可能更多地是*个人*习惯,而不是普遍接受的C++习惯? - UncleBens
1
@UncleBens,是的,那是我的个人习语。我认为那些不太出名的个人习语可能更有趣。 - xmllmx
1
如果您需要两个嵌套的for循环怎么办?使用您的宏,占位符变量会发生冲突。 - mingos
显示剩余7条评论
4个回答

9

RAII 是我首选的技术之一。在许多情况下,它非常实用...

作为一个通用实现,像安德烈·亚历山德鲁斯库的libloki一样,最有用。


3
RAII是我最希望其他编程语言支持的C++特性之一。 - user395760
+1 为 RAII 和回答速度。 - Prasoon Saurav

5

4
我知道你会这么说。 :D - Nawaz
@Nawaz:我想要说 RAII,但是已经有人提到了。我不得不给它起一个不同的名字。 - Prasoon Saurav
@Nawaz:有人看了太多《审判者 Dredd》 :) - Stuart Golodetz

4

RAII + 在需要确切生命周期的情况下打开嵌套块:

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
...

4
很好的问题,但我认为你的例子不太好!你的LOOP宏并没有使任何东西更清晰 - 它实际上隐藏了那些不使用你的宏的程序员的意图,并且它甚至看起来都不像C++ - 我对你的代码片段的第一反应是“那是C++吗?”或者“一个普通的for有什么问题吗?”。重复编写循环可能会很繁琐,但我们都知道每个人花在阅读和维护代码上的时间比最初编写代码要多得多,因此编写完整的for并不是浪费时间,而且更加清晰。你可以继续争论你的观点,但你应该知道,在这种方式中使用宏并不是一种广泛接受的技术 - 其他人查看你的代码也会指出它的问题。
无论如何,添加一个真正的答案 - 我在C++0x中最喜欢的习惯用法是一个唯一指针的向量:
std::vector<std::unique_ptr<T>> my_container;

它有以下优点-本质上是指针的安全向量:
  • 提供O(1)时间的随机访问
  • 即使重新分配内存(因此您可以安全地获取T地址并将其存储),元素也保证永远不会在内存中移动
  • 对于排序等任务快速(仅洗牌一些指针,而不是复制重量级对象)
  • 异常安全且有助于防止内存泄漏-对元素进行erase()还会释放内存
  • 灵活-您可以将指针从容器中std::move()出来并将它们放在其他地方

它确实有一两个缺点:

  • 每个元素都分配在堆上,如果添加/删除大量元素可能会有性能影响,另外元素在内存中可能相距较远,导致缓存局部性下降
  • 迭代需要双重间接(*i)->member语法-但我认为这并不是什么大问题

然而,特别是对于重量级对象,我认为它几乎是理想的容器。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接