STL迭代器循环

时间:2012-07-20 20:14:07

标签: c++ stl vector std

我写了这段代码:

#define VECTOR_LOOP_V(X) for (vector<typeof(X)>::iterator it = X.begin(); it != X.end(); it++)

使写入for循环的速度更快,但由于某种原因它不起作用,当我尝试编译它时,它给了我非常非常长的错误信息。

 test.cpp: In function ‘int main(int, char**)’:
test.cpp:20:5: error: conversion from ‘std::vector<std::basic_string<char> >::iterator {aka __gnu_cxx::__normal_iterator<std::basic_string<char>*, std::vector<std::basic_string<char> > >}’ to non-scalar type ‘std::v

等。

2 个答案:

答案 0 :(得分:4)

#define VECTOR_LOOP_V(X) \
     for (vector<typeof(X)>::iterator it = X.begin(); \
          it != X.end(); it++)

您打算如何使用宏?看起来X是容器,在这种情况下,for的第一部分应该类似于typeof(X)::iterator(甚至不知道这是否合法,因为{{1}不是标准的,从未使用过。)

或者,您可以使用boost :: foreach,它提供类似但更丰富的宏,并且在许多方面具有更安全的优点。例如,如果参数是一个按值返回的函数调用,那么你的宏会破坏:

typeof

问题与几乎所有的宏一样,你多次评估参数,在你的情况下,std::vector<int> f(); VECTOR_LOOP_V( f() ) { std::cout << *it << "\n"; } 将是一个it的迭代器,终止条件将尝试将它与迭代器进行比较来自不同的std::vector<int>

答案 1 :(得分:3)

它不起作用,因为typeof(X)会产生std::vector类型,因此宏扩展为:

for (vector<std::vector<...> >::iterator it = X.begin(); it != X.end(); it++)

此外,如果X不变,您的宏将失败,在这种情况下应使用const_iterator。还有很多其他问题,但无论如何,你试图做的是这样的:

#define VECTOR_LOOP_V(X) \
    for (typeof(X.begin()) it = X.begin(), eit = X.end(); it != eit; ++it)

..这里有一些用法示例:

#include <vector>
#include <iostream>

#define VECTOR_LOOP_V(X) \
    for (typeof(X.begin()) it = X.begin(), eit = X.end(); it != eit; ++it)

int main()
{
    std::vector<int> v;
    v.push_back(1);
    v.push_back(2);
    v.push_back(3);
    v.push_back(4);
    v.push_back(5);
    VECTOR_LOOP_V(v) {
        std::cout << *it << std::endl;
    }
}

但请注意,typeof不是标准C ++(请参阅this Q/A)。

总而言之,最好使用BOOST_FOREACH(或者至少看看它是如何在那里实现的)或C ++ 11 range-based for循环。

P.S。:不要使用STL缩写,除非你的意思是STL而不是C++ Standard Library(你可以称之为stdlib)。