0

我写了这段代码:

#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

ETC..

4

2 回答 2

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

你打算如何使用宏?看起来像是X容器,在这种情况下,第一部分for应该是这样的typeof(X)::iterator(甚至不知道这是否合法,因为typeof它不是标准的并且从未使用过)。

或者,您可以只使用 boost::foreach ,它提供了一个类似但更丰富的宏,其优点是它在许多方面更安全。例如,如果参数是按值返回的函数调用,您的宏将严重中断:

std::vector<int> f();
VECTOR_LOOP_V( f() ) {
   std::cout << *it << "\n";
}

问题与几乎所有您多次评估参数的宏一样,并且在您的情况下it将是一个迭代器std::vector<int>,终止条件将尝试将它与来自不同的迭代器进行比较std::vector<int>

于 2012-07-20T20:17:02.850 回答
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++(请参阅此 Q/A)。

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

PS:不要使用 STL 的缩写,除非你真的是指STL而不是C++ 标准库(你可以将其称为 stdlib)。

于 2012-07-20T20:29:34.947 回答