如何打印包含集合的地图的内容
How can I print the content of a map containing a set?
我有一个地图声明如下:
map < string, set<string> > index;
std::map < string, set<string> >::iterator iter;
我想打印index
的内容。因此,我写了以下内容:
for (iter = index.begin(); iter!= index.end(); iter++){
cout << iter->first << endl;} // It's OK.
但是如果我尝试打印iter->second
,上面的代码不起作用:
for (iter = index.begin(); iter!= index.end(); iter++){
cout << iter-> second << endl;} // Doesn't work.
我想这是因为index
中的second
是一组字符串,而不是一个简单的字符串。但是我该如何打印它呢?
如果要打印
iter->second
使用运算符 <<,您必须覆盖此运算符!否则,使用集合迭代器迭代由 iter->second 呈现的字符串集:
set<string>::iterator iterator_;
更新 [迭代器]
迭代很容易,忍者解决方案是重载操作员! :P
迭 代:
map<string, set<string> >::iterator iter_;
for (iter_ = index_.begin(); iter_ != index_.end(); iter_++) {
cout << iter_->first << " - ";
set<string>::iterator iterator_;
for (iterator_ = s.begin(); iterator_ != s.end(); iterator_++) {
cout << *iterator_ << " - ";
}
cout << endl;
}
更新 [重载 ostream&opeartor<<]
class MySet: public set<string> {
friend ostream& operator<<(ostream& out, const MySet& s) {
set<string>::iterator iterator_;
for (iterator_ = s.begin(); iterator_ != s.end(); iterator_++) {
out << *iterator_;
}
return out;
}
void test() {
map<string, MySet> index_;
map<string, MySet>::iterator iter_;
for (iter_ = index_.begin(); iter_ != index_.end(); iter_++) {
cout << iter_->first << " - ";
cout << iter_->second;
}
}
};
在过去的几年里,我一直使用以下函数。如果重载运算符<<,则必须小心,因为编译器最终可能会出错,因为它无法在标准运算符<<和自定义运算符<<之间进行选择。
随着 C++11 引入了 lambda 和基于范围的 for 循环,我可能会不那么频繁地需要它。
#include <vector>
#include <iostream>
#include <algorithm>
#include <iterator>
using namespace std;
template<typename C>
void print_container(ostream& os, const C& c)
{
copy(c.begin(), c.end(), ostream_iterator<int>(os, " "));
}
int main(void)
{
vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
print_container(v);
}
(在我看来)C++中最烦人的事情是没有为标准库类型定义输出运算符。
你需要一些代码,比如:
typedef std::map < string, set<string> >::iterator iter;
for (iter = index.begin(); iter!= index.end(); iter++) {
std::cout << iter->first << " : {";
for(set<string>::iterator it = iter->second.begin(); it != iter->second.end(); ++it) {
std::cout << *it << " ";
}
std::cout << "}n";
}
正如您所说,iter->second
表示代码中的一组字符串。您不能简单地打印它,因为默认情况下,operator<<
输出流不知道如何格式化std::set
。正如 Luca Davanzo 的回答中所解释的那样,一种解决方案是为您的集合重载该运算符。
另一个解决方案,如克里斯·杰斐逊的回答所示,是简单地添加另一个循环来迭代你的集合。但是,可以使用以下 C++11 功能来提高该解决方案的可读性:基于范围的 for 循环和占位符自动。因此,您的代码可能如下所示:
std::map<std::string, std::set<std::string>> index;
index["a"] = { "v", "w" };
index["b"] = { "x", "y", "z" };
for (const auto &mapItem : index) {
std::cout << "m[" << mapItem.first << "] =";
for (const auto &setItem : mapItem.second)
std::cout << " " << setItem;
std::cout << std::endl;
}
输出:
m[a] = v w
m[b] = x y z
从 C++17 开始,您可以将基于范围的 for 循环与结构化绑定一起使用。这进一步提高了可读性,因为您可以从代码中删除first
和second
成员:
for (const auto &[k, v] : index) {
std::cout << "m[" << k << "] =";
for (const auto &s : v)
std::cout << " " << s;
std::cout << std::endl;
}
科里鲁密码
- 处理多个异常集合的C++方法
- 给定n个元素的m个集合.在C++中找到出现在最大集合数中的元素
- 为什么不;名字在地图上是按顺序排列的吗
- 基于多个条件处理地图中的所有元素
- 如何将ampl中的集合表示为c++中的向量
- 检查值是否在集合p1和p2中,但不在p3中
- 带过滤器的现代迭代c++集合
- 如何将结构插入到集合中并打印集合的成员
- 在C++中将矢量转换为嵌套地图
- Boost HANA:从集合创建地图和默认值
- 将集合插入/读取到地图中
- 如何输出用作地图键的集合
- 如何打印包含集合的地图的内容
- 如果我的密钥是我价值的一部分,我应该使用地图还是集合
- C++地图和集合相关查询
- 对基于地图C++集合重新排序的有效方法
- 为什么我可以在地图中使用push_back,但不能在集合中使用back_inserter
- 如何将地图转换为集合
- 地图、集合等的array_view替代方案
- 如何从地图中的集合中删除元素