亲爱的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;
}
}
答案 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;
它具有以下优点 - 本质上是一个安全的指针向量:
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
...