循环中

时间:2017-05-07 14:00:07

标签: c++ loops iterator

我有list<Thing*> clothes。我想将things打印成所需的格式:

+- shirt
+- pants
\\ shoes

基本上除了最后一次迭代之外,所有输出都是相同的。到目前为止,我试过这个:

string CCloset::OutputContent() const {
    string output;
    for(auto i : this->clothes) {
        if( next(i) == this->clothes.end() ) {
            output.append("\\");
        } else {
            output.append("+-");
        }

        output.append( i->Output() );
    }
    return output;
}

理论上说,如果下一次迭代导致迭代器i处于list.end(),则意味着我们处于最后一个元素,因此我们稍微修改输出。编译器说Can't compare structures

next()返回指向下一个元素的迭代器。在最后一个元素的情况下,它将指向列表的过去结束。 list.end()返回指向列表的末尾的迭代器。

我错过了什么?

2 个答案:

答案 0 :(得分:2)

正如评论者已经指出的那样,i不是迭代器,而是元素的值。

如果修改循环使用引用而不是值,则可以将当前元素的地址与最后一个元素的地址进行比较,如下所示:

for( const auto& i : this->clothes ) {
    if( &i == &this->clothes.back() ) {
        output.append("\\");
    } else {
        output.append("+-");
    }

    output.append( i->Output() );
}

Live demo on Coliru

答案 1 :(得分:1)

i不是迭代器。 std::next只能使用ForwardIterator或InputIterator调用,而不能使用容器元素调用。

这是基于迭代器的循环的唯一用例之一:

for(auto it = clothes.begin(); it != clothes.end(); ++it) {
    if( it + 1 == clothes.end() ) {
        output.append("\\");
    } else {
        output.append("+-");
    }

    output.append( (*it)->Output() );
}