检测迭代器是否是std::map的最后一个元素
Detect if iterator is last element of std::map
这与这个问题类似,但不是重复的。我试图遍历映射并打印每个元素的值,但最后一个元素的输出略有不同。在这个问题上,他们建议使用map.rbegin().base()
,但它对我不起作用
这是我的代码:
#include <iostream>
#include <map>
int main()
{
std::map <char, int> charMap = { {'a', 1}, {'b', 2}, {'c', 3}, {'d', 4} };
for (auto iter = charMap.begin(); iter != charMap.end(); iter++)
{
std::cout << iter->first << ":t" << iter->second;
if (iter == charMap.rbegin().base())
std::cout << "t//This is the last element.n";
else
std::cout << "n";
}
}
我希望我的输出是这样的:
a: 1
b: 2
c: 3
d: 4 //This is the last element.
但相反,我得到了这样的输出:
a: 1
b: 2
c: 3
d: 4
现在我意识到有更好的方法可以做到这一点,但我希望这也能奏效。为什么我不能比较iter
和charMap.rbegin().base()
?
使用<iterator>
中的std::next
作为
if (std::next(iter) == charMap.end())
std::cout << "t//This is the last element.n";
相反。
base()
方法将迭代器返回到反向迭代器所指向的元素后面的元素。这意味着rbegin().base()
等同于end()
为了完成你的任务,你可以这样做:
#include <iostream>
#include <map>
int main()
{
std::map <char, int> charMap = { {'a', 1}, {'b', 2}, {'c', 3}, {'d', 4} };
for (auto iter = charMap.begin(); iter != charMap.end(); )
{
std::cout << iter->first << ":t" << iter->second;
if (++iter == charMap.end())
std::cout << "t//This is the last element.n";
else
std::cout << "n";
}
}
因为std::reverse_iterator
存储的迭代器偏移量为1
,所以charMap.rbegin().base() == charMap.end()
。这里的图表说明了这一点。
您应该使用<iterator>
:中的std::prev
或std::next
iter == std::prev(charMap.end())
或
std::next(iter) == charMap.end()
无论你觉得哪个更有意义。
base()
不返回相同的元素:
基迭代器指的是
reverse_iterator
当前指向的元素的下一个元素(从std::reverse_iterator::iterator_type perspective
开始),即&*(rit.base() - 1) == &*rit
。
按预期工作:
#include <iostream>
#include <map>
int main()
{
std::map <char, int> charMap = { {'a', 1}, {'b', 2}, {'c', 3}, {'d', 4} };
auto last = charMap.rbegin();
++last;
for (auto iter = charMap.begin(); iter != charMap.end(); iter++)
{
std::cout << iter->first << ":t" << iter->second;
if (iter == last.base())
std::cout << "t//This is the last element.n";
else
std::cout << "n";
}
}
实际上,由于iter
与charMap.rbegin().base()
确实不同,因此不希望这样做。
您的逻辑是正确的,唯一的问题是charMap.rbegin().base()
迭代器等于charMap.end()
,但您在iter
达到charMap.end()
值的那一刻留下了for语句,因此它从未有机会在for循环内的if语句中测试它。
为了使它发挥作用,你可以用以下方式重写if语句:
if (iter->first == charMap.rbegin()->first)
std::cout << "t//This is the last element.n";
else
std::cout << "n";
因此,您将比较映射键,而不是迭代器本身。
丑陋。但是
auto iterCpy = iter;
if (++iterCpy == charMap.end())
std::cout << "t//This is the last element.n";
使用vsoftco的答案:)
这是有效的:
#include <iostream>
#include <map>
int main()
{
std::map <char, int> charMap = { {'a', 1}, {'b', 2}, {'c', 3}, {'d', 4} };
for (auto iter = charMap.begin(); ;)
{
std::cout << iter->first << ":t" << iter->second;
if (++iter== charMap.end()){
std::cout << "t//This is the last element.n"; break;
}
else
std::cout << "n";
}
}
- lower_bound()返回最后一个元素
- 使用运算符 [] 引用 std::vector 上最后一个元素时出现问题<>
- Lower_bound不适用于具有 3 个元素的向量的最后一个元素
- 仅显示链表的最后一个元素
- push_back通过自行创建的对象获取最后一个元素的向量
- 使用 map.end() 访问 map 的最后一个元素
- 如何知道地图中的最后一个元素是否被删除?
- std::矢量保存 只推送最后一个元素
- 反转后不返回最后一个元素
- 如何在新数组较小时创建新数组并将旧数组的最后一个元素复制到新数组中?
- 在 QListView 中显示最后一个元素
- C++:在进行切片时对迭代器的约定,特别是对于访问最后一个元素并最终将其删除
- 遍历列表包含排除最后一个元素的内容
- 如何打印第一个和最后一个元素的和,然后打印第二个和倒数第二个元素的总和,依此类推
- C++链表最后一个元素的迭代器?
- 这种获取模板参数包中最后一个元素的方法是否有隐藏的开销?
- 使用 STL 交换堆栈 C++ 中的第一个和最后一个元素
- 数组:如何在指定索引之前显示数组的第一个和最后一个元素以及数组元素的差异?
- 你能pop_back一个向量,并且仍然使用迭代器到最后一个元素吗?
- 如何使用第一个、中间和最后一个元素的中位数正确分区?