如何在控制台上的三个不同列中一起打印三个地图? C ++

时间:2015-04-23 14:16:20

标签: c++ c++11 stl

我有三个map<string,int>个实例。这三个都包含学生姓名和他们的分数。第一张地图包含计算机学生,第二张包含医学生,第三张图包含商科学生。我知道我必须使用<iomanip>库和setw。我没有得到的是如何同时遍历所有三个以将它们打印在一起?有人可以帮忙吗?我希望它在控制台上打印为:

COMPUTER MEDICAL COMMERCE
joey 45 ed 20 harold 50
malisa 36 jane 60 aron 70
emily 60 judy 70 barney 45

到目前为止我所拥有的只是在另一个

之后打印一张地图
  map<string,int> ::const_iterator it;
  cout<<endl;
  cout<<setw(36)<<"COMPUTER STUDENTS"<<endl;
  for( it = one.begin(); it != one.end(); ++it)
  {
    cout <<setw(20)<<it->first;
    cout <<setw(5)<<it->second<<endl;
  }
  cout<<setw(36)<<"MEDICAL STUDENTS"<<endl;
  for( it = two.begin(); it != two.end(); ++it)
  {
    cout <<setw(20)<<it->first;
    cout <<setw(5)<<it->second<<endl;
  }
  cout<<setw(36)<<"COMMERCE STUDENTS"<<endl;
  for(it = three.begin(); it != three.end(); ++it)
  {
    cout <<setw(20)<<it->first;
    cout <<setw(5)<< it->second<<endl;
  }`

3 个答案:

答案 0 :(得分:2)

为下一个地图的第一个地图和迭代器使用范围循环:

 std::map<string,int> one, two, three;
  //You inserted records to all three maps
   std::map<string,int>::iterator it2 = two.begin();
   std::map<string,int>::iterator it3 = three.begin();

  if( one.size()== two.size() &&  two.size()==  three.size())
  {
    for( auto &x : one)
    {
        std::cout<<setw(20)<< x.first;
        std::cout<<setw(5)<< x.second;
        std::cout<<setw(20)<<it2->first;
        std::cout<<setw(5)<< it2->second;
        std::cout<<setw(20)<<it3->first;
        std::cout<<setw(5)<< it3->second;
        ++it2;
        ++it3;
    }

  }

答案 1 :(得分:0)

由于大小保证相等(根据您的注释),您可以使用一个循环和三个迭代器,类似于以下内容。请注意,cout语句应根据您的需要进行安排。这只是为了展示如何在单个循环中迭代三组相同大小的示例

map<string,int> ::const_iterator it1, it2, it3;

it1=one.begin();
it2=two.begin();
it3=three.begin();

while(it1!=one.end())
{
    cout<<it1->first<<" ";  // You should format them based on your need
    cout<<it1->second<<" "; // This is just an example.
    cout<<it2->first<<" ";
    cout<<it2->second<<" ";
    cout<<it3->first<<" ";
    cout<<it3->second<<" ";
    it1++; it2++; it3++;
}

答案 2 :(得分:0)

我不需要同等大小的假设。 将三张地图的内容放入一个公共向量:

#include <iostream> 
#include <vector>
#include <map>
#include <algorithm>
using namespace std;
int main()
{
 map<int, int> m;
 m[1] = 1;
 m[2] = 2;
 map<int, int> n;
 n[3] = 3;
 n[4] = 4;
vector<pair<int, int> > v;
copy(m.begin(), m.end(), back_inserter(v));
copy(n.begin(), n.end(), back_inserter(v));
for(int i = 0; i < v.size(); ++i)
cout << v[i].first << " : " << v[i].second << endl;
}

这会占用额外的内存。但好处是你可以通过矢量中的任何算法(例如排序)对这些数据做任何你想做的事情。我不知道为什么你需要三张地图。我的偏好是为数据添加一个额外的标志,并将它们放在一个地图中。