cpp向量用于循环终止条件错误

时间:2015-02-01 12:14:33

标签: c++ c++11

编译以下函数时,以下是编译错误。为什么第二个for循环中的yt != endIx是非法的。

  

错误C2678:二进制'!=' :找不到哪个运算符采用了类型' std :: _ Vector_iterator>>'的左手操作数。 (或者没有可接受的转换)

void printDebug(vector <int>  ar)
{
    for (auto it = ar.begin(); it != ar.end(); it++)
    {
        auto endIx = ar.end() - it;
        for (auto yt = ar.begin(); yt != endIx ; yt++)
        {
            cout << *it << " : " << endIx ;
        }
        cout << endl;
    }
}

为了避免混淆,我已将auto end iterator重命名为endIx;

1 个答案:

答案 0 :(得分:9)

ar.end() - it的类型是std::vector<int>::difference_type(a container trait给出迭代器之间的距离类型),它是不是迭代器。

在循环中使用迭代器算法与ar.begin() + end

void printDebug(vector <int>  ar)
{
    for (auto it = ar.begin(); it != ar.end(); it++)
    {
        auto end = ar.end() - it; // end is of type vector <int>::difference_type
        for (auto yt = ar.begin(); yt != ar.begin() + end; yt++)
        {
            cout << *it << " : " << end;
        }
        cout << endl;
    }
}

注意:

您应该通过const引用传递矢量,而不是通过值传递:

void printDebug(const vector<int>&  ar)
{
    for (auto it = ar.begin(); it != ar.end(); it++)
    {
        auto end = ar.end() - it; // end is of type vector <int>::difference_type
        for (auto yt = ar.begin(); yt != ar.begin() + end; yt++)
        {
            cout << *it << " : " << end;
        }
        cout << endl;
    }
}