我有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()
返回指向列表的末尾的迭代器。
我错过了什么?
答案 0 :(得分:2)
正如评论者已经指出的那样,i
不是迭代器,而是元素的值。
如果修改循环使用引用而不是值,则可以将当前元素的地址与最后一个元素的地址进行比较,如下所示:
for( const auto& i : this->clothes ) {
if( &i == &this->clothes.back() ) {
output.append("\\");
} else {
output.append("+-");
}
output.append( i->Output() );
}
答案 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() );
}