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

What are your favorite C++ idioms?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
What are your favorite C++ Coding Style idioms

亲爱的C++粉丝们,

你能列举一下你最喜欢的C++习语吗?最好列出那些有用但不知名的。

首先,我放了一个:

为了避免冗长的重复for (size_t i = 0; i < n; ++i) {...},我使用如下宏:

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++"吗?或者"普通的for有什么问题?".一遍又一遍地编写循环可能会很乏味,但我们都知道,每个人在阅读和维护代码上花费的时间比在第一时间编写代码要多得多,因此编写完整的for并不是浪费时间,而且更清楚。你可以继续争论你的观点,但是你应该意识到以这种方式使用宏并不是一种被广泛接受的技术——其他人看到你的代码也会把你叫来。

不管怎样,添加一个实际答案——我最喜欢的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
...