我有一个数据结构。
map <const char*, vector<double> > m;
Key values
AA 1 2 3 1 2 1 2 3
BB 2 3 4 1 2 3 4 5
CC 2 3 4 1 2 3 4 5
我想以下列格式打印输出:
AA BB CC
1 2 2
2 3 3
3 4 4
1 1 1
2 2 2
1 3 3
2 4 4
3 5 5
我如何以有效的方式实现这一目标?迭代地图和复制矢量非常耗时。
此致
答案 0 :(得分:3)
想法是迭代第一轮来打印地图的关键,然后通过每个向量并逐个打印出元素(如果有的话)。
void func()
{
std::map<std::string, std::vector<int> > m;
m["AA"] = {1, 2, 3, 1, 2, 1, 2, 3};
m["BB"] = {2, 3, 4, 1, 2, 3, 4, 5, 5 };
m["CC"] = {2, 3, 4, 1, 2, 3, 4, 5};
size_t size = 0;
for (auto item = m.begin(); item != m.end(); ++item)
{
std::cout << item->first << '\t';
if (size < item->second.size())
{
size = item->second.size();
}
}
std::cout << std::endl;
for (size_t i = 0; i< size; i++)
{
for (auto item = m.begin(); item != m.end(); ++item)
{
if (i < item->second.size())
{
std::cout << item->second.at(i) << '\t';
}
}
std::cout << std::endl;
}
}
如果所有矢量具有相同的大小,则可以忽略大小检查并使用[]运算符来获得更好的速度。
for (size_t i = 0; i< size; i++)
{
for (auto item = m.begin(); item != m.end(); ++item)
{
std::cout << item->second[i] << '\t';
}
std::cout << std::endl;
}
查看示例代码link,享受
答案 1 :(得分:2)
我想出了什么。
警告:未经测试!
using namespace std;
map <const char*, vector<double> > m;
vector<double>::size_type int index = -1;
map <const char*, vector<double> >::size_type finishedVectors = 0;
while(1)
{
for(map <const char*, vector<double> >::iterator it = m.begin(); it != m.end(); ++it)
{
if(index == -1)
{
std::cout << it->first << "\t";
}
else
{
if(index < it->second.size())
{
std::cout << it->second[i] << "\t";
}
else
{
++finishedVectors;
}
}
}
if(finishedVectors == m.size())
{
break;
}
++index;
}