2

私は1つのデータ構造を持っています。

  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

これを効率的に実装するにはどうすればよいですか?マップの繰り返しとベクターのコピーは非常に時間がかかります。

よろしく

4

2 に答える 2

3

アイデアは、最初のラウンドを繰り返してマップのキーを印刷し、次に各ベクトルを調べて、要素があれば1つずつ印刷することです。

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;
  }

サンプルコードのリンクを参照して、お楽しみください

于 2013-01-10T08:06:39.820 に答える
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;
}
于 2013-01-10T07:48:14.170 に答える