打印(复合)容器内容的代码.

近期写一些代码经常需要打印出容器结果,主要是给自己看看结果正确性。

不想每次自己写几层for,所以写了下面的代码。

template<typename T>
void printcon(T& con, const string& split = " ")
{
	_PrintImpl<typename T::value_type>::template impl<T>(con, split);
}

template<typename T>
struct _PrintValue
{
	template<typename Conn>
	static void print(Conn& con, const string& split)
	{
		copy(con.begin(), con.end(), ostream_iterator<T>(cout, split.c_str()));
	}
};
template<typename T, typename U>
struct _PrintValue<pair<T,U> >
{
	template<typename Conn>
	static void print(Conn& con, const string& split)
	{
		for(typename Conn::iterator it = con.begin() ; it != con.end() ; ++ it)
			cout<<"k:"<<it->first<<" v:"<<it->second<<split;
	}
};


template<typename Con>
void _print_atomic(Con& con, const string& split)
{
	_PrintValue<typename Con::value_type>::print(con, split);
	//copy(con.begin(), con.end(), ostream_iterator<typename Con::value_type>(cout, split.c_str()));
	cout<<endl;
}
template<typename Con>
void _print_subcon(Con& con, const string& split)
{
	typedef typename Con::value_type subcon_t;
#if 0
	for(typename Con::iterator it = con.begin() ; it != con.end() ; ++ it)
		printcon<subcon_t>(*it, split);
#else
	for_each(con.begin(), con.end(), bind(printcon<subcon_t>, _Ph<1>(), split));
#endif
}

template<typename ElemT>
struct _PrintImpl
{
	template<typename Con>
	static void impl(Con& con, const string& split)
	{
		_print_atomic<Con>(con, split);
	}
};
template<typename T, typename Alloc>
struct _PrintImpl<vector<T, Alloc> >
{
	template<typename Con>
	static void impl(Con& con, const string& split)
	{
		_print_subcon<Con>(con, split);
	}
};
template<typename T, typename Alloc>
struct _PrintImpl<list<T, Alloc> >
{
	template<typename Con>
	static void impl(Con& con, const string& split)
	{
		_print_subcon<Con>(con, split);
	}
};

template<typename T, typename Pred, typename Alloc>
struct _PrintImpl<set<T, Pred, Alloc> >
{
	template<typename Con>
	static void impl(Con& con, const string& split)
	{
		_print_subcon<Con>(con, split);
	}
};

template<typename K, typename V, typename Pred, typename Alloc>
struct _PrintImpl<map<K, V, Pred, Alloc> >
{
	template<typename Con>
	static void impl(Con& con, const string& split)
	{
		_print_subcon<Con>(con, split);
	}
};

namespace test_printcon
{
	void main()
	{
		int a[] = {1,2,3,4,5};
		set<int> s(a, a + _countof(a));

		vector<int> v(a, a + _countof(a));

		list<vector<int> > lv;
		lv.push_back(v);
		lv.push_back(v);
		printcon(lv);

		set<vector<int> > sv;
		sv.insert(v);
		printcon(sv);


		vector<set<int> > vs;
		vs.push_back(s);
		vs.push_back(s);
		printcon(vs);

		map<int, int> m;
		m.insert(make_pair(1, 1));
		m.insert(make_pair(2, 2));

		list<map<int, int> > lm;
		lm.push_back(m);
		printcon(lm);
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值