循环中列表的最后一个元素

Last element of a list in a loop

本文关键字:最后一个 元素 列表 循环      更新时间:2023-10-16

我有一个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()返回指向列表末尾的迭代器。

我错过了什么?

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

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

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

科利鲁的现场演示。

i不是

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

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

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