将STL映射打印为表格
Print a STL Map as a table
我有一个定义为map<string, vector<double> >
的映射。
如何将此打印为表格。我希望映射的键是表的标题行,表的每一列都是vector
假设我最初的地图是
hash = {
"a": [1, 2, 3],
"b": [1, 2, 3]
}
我想把这个打印成
a b
1 1
2 2
3 3
这里有一个使用C++11的可能实现(这里我希望所有向量都有相同的大小(:
#include <map>
#include <string>
#include <vector>
#include <iostream>
void print(std::map<std::string, std::vector<double>> const& m)
{
// Do nothing for an empty table...
if (m.begin() == m.end()) { return; }
for (size_t i = 0; i <= m.begin()->second.size(); i++)
{
for (auto const& p : m)
{
if (i == 0) { std::cout << p.first << " "; }
else { std::cout << p.second[i - 1] << " "; }
}
std::cout << std::endl;
}
}
int main()
{
std::map<std::string, std::vector<double>> m = {
{ "a", { 1, 2, 3, 0 } },
{ "b", { 2, 4, 6, 1 } },
{ "c", { 9, 2, 3, 2 } }
};
print(m);
}
这是一个活生生的例子。
灵活适用于任意列和可变长度
void print(const map<string, vector<double>> &m)
{
size_t rows = 0;
for (auto const &i : m)
{
cout << i.first << ' ';
if (i.second.size() > rows)
rows = i.second.size();
}
cout << endl;
for (size_t r = 0; r < rows; ++r)
{
for (auto const &i : m)
if (r < i.second.size())
cout << i.second[r] << " ";
else
cout << " ";
cout << endl;
}
}
int main()
{
map<string, vector<double> > m = {
{ "a", { 1, 2, 3}},
{ "b", { 1, 2, 3, 4}},
{ "c", { 1, 2}},
{ "d", { 1}},
{ "e", { 1, 2, 3, 4, 5, 6, 7}}
};
print(m);
}
输出
a b c d e
1 1 1 1 1
2 2 2 2
3 3 3
4 4
5
6
7
实时源代码。
这适用于不同长度的矢量:
#include <iostream>
#include <map>
#include <vector>
#include <string>
using namespace std;
int main()
{
map<string,vector<double> > hashes;
double arr[]={1,2,3};
double arr2[]={1,2,3,4};
hashes.insert(pair<string,vector<double> >("a",vector<double>(arr,arr+sizeof(arr)/sizeof(double))));
hashes.insert(pair<string,vector<double> >("b",vector<double>(arr,arr+sizeof(arr)/sizeof(double))));
hashes.insert(pair<string,vector<double> >("c",vector<double>(arr2,arr2+sizeof(arr2)/sizeof(double))));
for(auto i: hashes)
{
cout<< i.first << ' ';
}
cout << endl;
int max_len=0;
for(auto i: hashes)
{
if(i.second.size()>max_len) max_len=i.second.size();
}
for(int h=0; h<max_len; h++)
{
for(auto i: hashes)
{
if(h>=i.second.size()) cout << " ";
else cout << i.second[h] << " ";
}
cout << endl;
}
return 0;
}
输出:
a b c
1 1 1
2 2 2
3 3 3
4
#include <iostream>
#include <map>
#include <string>
#include <vector>
using namespace std;
int main()
{
map<string, vector<double> > m;
vector<double> a, b, c;
for (int i = 0; i < 4; ++i) a.push_back(i);
for (int i = 0; i < 6; ++i) b.push_back(i);
for (int i = 0; i < 7; ++i) c.push_back(i);
m["a"] = a;
m["b"] = b;
m["c"] = c;
int n = max(max(a.size(), b.size()), c.size());
for (map<string, vector<double> >::iterator i = m.begin(); i != m.end(); ++i)
cout << i->first << ',';
cout << endl;
for (int i = 0; i < n; ++i) {
for (map<string, vector<double> >::iterator it = m.begin(); it != m.end(); ++it)
cout << (i < it->second.size() ? it->second[i] : 0) << ',';
cout << endl;
}
}
我相信有更好的方法来进行迭代并处理尾随的,
。
此解决方案适用于任意数量的列,每个列具有任意数量的行。
列名也具有任意长度。
#include <map>
#include <string>
#include <vector>
#include <iostream>
void print(std::map<std::string, std::vector<double>> const& m)
{
std::vector<size_t> columnWidths;
std::vector< std::vector<std::string>> columns;
size_t totalRows = 0;
// Store all table elements, and the required width of each column
for ( auto a : m )
{
std::vector<std::string> column;
size_t width = a.first.length();
column.push_back( a.first );
size_t rows = 1;
for ( auto v : a.second )
{
++rows;
std::string entry = std::to_string(v);
width = std::max( width, entry.length() );
column.push_back( entry );
}
columnWidths.push_back( width );
columns.push_back( column );
totalRows = std::max( totalRows, rows );
}
// Print all table elements
for ( size_t row = 0; row != totalRows; ++row )
{
for ( size_t col = 0; col != columns.size(); ++col )
{
std::string entry;
if ( columns[col].size() > row )
{
entry = columns[col][row];
}
entry.resize( columnWidths[col], ' ' );
std::cout << entry << ' ';
}
std::cout << 'n';
}
}
int main()
{
std::map<std::string, std::vector<double>> m =
{
{ "a", { 1, 2, 3} },
{ "a really really long string", { 1, 2, 3} },
{ "b", { 1, 2, 3, 4, 5 } }
};
print(m);
}
相关文章:
- 如何循环打印顶点结构
- 为什么在popback()操作之后,它仍然打印完整的矢量
- 如何在c++中打印目录
- 有一个打印语句的函数是一种糟糕的编程实践吗
- 在线编译器中的分段C++没有打印消息
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 如何将结构插入到集合中并打印集合的成员
- 在循环C++中指定字符串之后,不会打印该字符串
- 以螺旋方式打印矩阵的程序.(工作不好)
- 从控制台中删除最后打印的元素
- 如何使用Crypto++并为RSA返回可打印的字节/字符数组
- 如何仅使用对象名称打印特定于对象的成员
- 回溯C++不打印函数,因此文件
- 在一定长度后从数组中打印时缺少整数
- Q打印表格和文本
- 生成要在Qt中打印出来的表格
- 如何在visual studio C++中打印整个表格
- 打印表格C++
- 将STL映射打印为表格