循环中列表的最后一个元素
Last element of a list in a loop
我有一个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() );
}
相关文章:
- lower_bound()返回最后一个元素
- 使用运算符 [] 引用 std::vector 上最后一个元素时出现问题<>
- Lower_bound不适用于具有 3 个元素的向量的最后一个元素
- 仅显示链表的最后一个元素
- push_back通过自行创建的对象获取最后一个元素的向量
- 使用 map.end() 访问 map 的最后一个元素
- 如何知道地图中的最后一个元素是否被删除?
- std::矢量保存 只推送最后一个元素
- 反转后不返回最后一个元素
- 如何在新数组较小时创建新数组并将旧数组的最后一个元素复制到新数组中?
- 在 QListView 中显示最后一个元素
- C++:在进行切片时对迭代器的约定,特别是对于访问最后一个元素并最终将其删除
- 遍历列表包含排除最后一个元素的内容
- 如何打印第一个和最后一个元素的和,然后打印第二个和倒数第二个元素的总和,依此类推
- C++链表最后一个元素的迭代器?
- 这种获取模板参数包中最后一个元素的方法是否有隐藏的开销?
- 使用 STL 交换堆栈 C++ 中的第一个和最后一个元素
- 数组:如何在指定索引之前显示数组的第一个和最后一个元素以及数组元素的差异?
- 你能pop_back一个向量,并且仍然使用迭代器到最后一个元素吗?
- 如何使用第一个、中间和最后一个元素的中位数正确分区?