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

等..

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、イテレータが 1 つ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: C++ 標準ライブラリ(stdlib などと呼ぶことができます)ではなく、本当にSTLを意味する場合を除き、STL の省略形を使用しないでください。

于 2012-07-20T20:29:34.947 に答える