你最喜欢的C ++习语是什么?

时间:2010-12-12 11:48:00

标签: c++ idioms

  

可能重复:
  What are your favorite C++ Coding Style idioms

亲爱的C ++粉丝,

你能在这里列出你最喜欢的C ++习语吗?最好列出那些有用而又不为人所知的内容。

首先,我把我的一个:

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

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

_i是绑定使用的占位符。

所以我可以写:

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

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

4 个答案:

答案 0 :(得分:9)

RAII位于我的列表顶部。有这么多的情况,它只是派上用场......

最有用的是像Andrei Alexandrescu这样的通用实现{{3p>

答案 1 :(得分:5)

答案 2 :(得分:4)

好问题,但我认为你的例子很糟糕!你的LOOP宏没有做任何更清楚的事实 - 它实际上隐藏了你不打算使用你的宏的程序员的意图,它甚至看起来不像C ++ - 我对你的代码片段的第一反应是“就是这样C ++?”或“普通for有什么问题?”。一遍又一遍地编写循环可能会很繁琐,但是我们都知道每个人花费更多的时间阅读和维护代码而不是首先编写代码,所以写出一个完整的for几乎不浪费时间,它更清晰。你可以继续争论你的观点,但是你应该知道以这种方式使用宏是一种被广泛接受的技术 - 看着你的代码的其他人也会打电话给你。

无论如何,要添加一个实际答案 - 我在C ++ 0x中最喜欢的习语是unique_ptr的向量:

std::vector<std::unique_ptr<T>> my_container;

它具有以下优点 - 本质上是一个安全的指针向量:

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

它确实有一两个缺点:

  • 每个元素都在堆上分配,如果添加/删除大量元素可能会影响性能,加上元素在内存中可能会相距很远,从而失去缓存局部性
  • 迭代需要双重间接(*i)->member语法 - 但我不认为这是一个大问题

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

答案 3 :(得分:3)

如果需要确切的生命周期范围,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
...