【发布时间】:2021-11-13 07:40:49
【问题描述】:
如何使用结构化绑定检测地图的最后一次迭代?
这是一个具体的例子:我有以下简单的代码,我使用 C++17 的结构化绑定从 std::map 打印元素:
#include <iostream>
#include <map>
#include <string>
int main() {
std::map<std::string, size_t> mymap {{"a", 0}, {"b", 1}, {"c", 2}, {"d", 3}};
// using structured bindings, C++17
for (auto const& [key, value] : mymap) {
std::cout << "key: " << key << ", value: " << value << ", ";
}
return 0;
}
问题是,这将导致尾随逗号,即
key: a, value: 0, key: b, value: 1, key: c, value: 2, key: d, value: 3,
受这个问题的启发:How can I detect the last iteration in a loop over std::map?,我可以编写带有迭代器的代码来打印出 std::map 的内容,而无需尾随逗号,即
for (auto iter = mymap.begin(); iter != mymap.end(); ++iter){
// detect final element
auto last_iteration = (--mymap.end());
if (iter==last_iteration) {
std::cout << "\"" << iter->first << "\": " << iter->second;
} else {
std::cout << "\"" << iter->first << "\": " << iter->second << ", ";
}
}
如何使用for (auto const& [key, value] : mymap) 做到这一点?如果我知道std::map 中的最后一个键,我可以为它写一个条件;但是有没有其他方法不用iter?
【问题讨论】:
-
@xskxzr 谢谢你的回答。我想我还是有点困惑;你能解释更多吗?
-
boost::algorithm::join 可能会提供一些灵感。
-
注意:下面有很多很棒的答案。我不得不将一个标记为已接受,但我要感谢大家的帮助。