c++迭代器有更好的语法吗?
is there prettier syntax for a c++ iterator?
在c++中是否有更漂亮/更简洁的方法来使用迭代器?从我所看到的教程中,我要么在任何地方设置typedef(对于许多一次性for循环来说,这样做很繁琐):
typedef std::vector<std:pair<int, int> >::iterator BlahIterator;
或有冗长的查找循环,如:
for (std::vector<std:pair<int, int> >::iterator it = ... ) ...
有更好的方法吗?
在c++ 11中,可以将基于范围的for循环与auto关键字结合使用:
for (auto& it : v) ...
对于boost,您可以使用FOR_EACH宏。
typedef pair<int, int> tElem;
BOOST_FOREACH( tElem e, aVector )
{
cout << e.first << " " << e.second << 'n';
}
算法在某种程度上解决了这个问题。
特别是使用新的lambda函数。
std::for_each(c.begin(), c.end(), Action()); /* Where Action is your functor */
或与lambda:
std::for_each(c.begin(), c.end(), [](type const& e) { /* Stuff */ });
注意:不要陷入使用std::for_each替换所有循环的陷阱。有很多使用迭代器的算法,可以根据容器的内容进行操作。
对于c++0x,您可以使用auto关键字:
for (auto i = v.begin(); i != v.end(); ++i) {}
我通常使用以下命名模式:
typedef std::pair<int, int> Blah;
typedef std::vector<Blah> Blahs;
,然后使用Blahs::iterator
,即我不命名迭代器,而是命名容器(通常是容器中包含的东西)。typedef
是一个非常有用的抽象机制。
请注意,"Blah"的向量被称为"Blahs"(即只是复数),而不是"BlahVector",因为具体的容器无关紧要。
一种可能是将循环(或任何使用迭代器的代码)编写为自己的小型泛型算法。通过将其设置为模板,编译器可以/将自动推断迭代器的类型:
template <class T>
do_something(T begin, T end) {
for (T pos = begin; pos != end; ++pos)
do_something_with(*pos);
}
我通常定义这个,尽管有人告诉我要为此下地狱:
#define forsn(i, s, n) for(int i = (s); i < (n); ++i)
#define forn(i, n) forsn(i, 0, n)
#define forall(it, g) for(typeof g.begin() it = g.begin(); it != g.end(); ++it)
然后,循环从0到n,一个常见的任务,我说forn(i, n) foo(i);
,并循环任何标准容器c,我说forall(it, c) foo(it);
。请注意,typeof
是GCC扩展到标准。
相关文章:
- C++:将控制台输出存储在宏中更好吗
- FFmpeg:制作一个应用程序比直接使用ffmepg更好吗
- 初始化具有非默认构造函数的std::数组项的更好方法
- 有没有比在库中添加一个并非由所有派生类实现的新虚拟函数更好的设计实践
- 为什么新的随机库比std::rand()更好
- 寻找一种更好的方法来表示无符号字符数组
- 哪种方法更好,性能明智
- 什么更好?返回对象指针列表?或返回指向对象列表的指针?
- 什么是更好的做法?通过指针或标识符传递类成员?
- 寻求更好地理解标准::访问
- 线程消息传递或更好:在"大师班"中访问其他班级的成员
- 有没有更好的方法来处理异常? try-catch块真的很丑
- 如何更好地检查两个 char 变量是否在一组值中?
- 有没有更好的方法对C++中的三个整数进行排序?
- 什么模板用法在阶乘中更好
- 平面缓冲区可以利用向量中的 0 吗?还是其他小波比哈尔变换更好?
- 我们应该如何使用枚举类进行索引(或者我们应该更好地避免这种情况)?
- c++迭代器有更好的语法吗?
- c++复制赋值语法比较-哪个更好
- 使用更好的语法/命名扩展特征