如何循环遍历地图并将值分配给C ++中的数组?

时间:2011-09-29 14:25:27

标签: c++ map

我有map<id,age>,;如何获得每个<id,age>对的年龄,并将年龄分配给C ++中的C风格数组?

有效的方法是什么?我的意思是如何以与地图相同的顺序填充C风格的数组?

4 个答案:

答案 0 :(得分:3)

如果您决定坚持使用固定阵列方法

//Assuming both id and age are integers
map<int,int> myMap; // Your id and age map
map<int,int>::iterator it;
int myList[100];
int i = 0;
for(it = myMap.begin(); (i < 100 && it != myMap.end()); it++)
{
  myList[i++] = (*it).second;
}

更好的方法是使用向量而不是数组

//Assuming both id and age are integers
map<int,int> myMap; // Your id and age map
map<int,int>::iterator it;
vector<int> myList;
for(it = myMap.begin(); it != myMap.end(); it++)
{
  myList.push_back((*it).second);
}

答案 1 :(得分:2)

如果你可以使用c ++ 11,你可以使用lambda表达式。

map<id,age> m;
std::list<age> l;
std::for_each(m.begin(), m.end(), [&l](std::pair<id,age> p){
    l.push_back(p.second);
});

答案 2 :(得分:1)

我不认为你提出的问题很有意义,但是为了摆弄C ++容器

(注意::不使用任何C ++ 0x功能) http://ideone.com/Kf2du

编辑为了回应DavidRodríguez的优秀评论,我编辑了代码以避免复制(另请参阅https://ideone.com/7Oa5n):

#include <map>
#include <list>
#include <algorithm>
#include <iterator>
#include <vector>

typedef std::map<std::string, int> map_t;

int getage(const map_t::value_type& pair)
{ 
    return pair.second; 
}

int main()
{
     map_t agemap;
     agemap["jill"] = 13;
     agemap["jack"] = 31;

     std::list<int> agelist(agemap.size());
     std::transform(agemap.begin(), agemap.end(), agelist.begin(), getage);

     // or:
     std::vector<int> v;
     std::transform(agemap.begin(), agemap.end(), std::back_inserter(v), getage);

}

根据大众需求,只是拼出

int age_array[10];
std::transform(agemap.begin(), agemap.end(), age_array, getage);

甚至

int *dyn_array = new int[agemap.size()];
std::transform(agemap.begin(), agemap.end(), dyn_array, getage);

// ...
delete[] dyn_array;

答案 3 :(得分:0)

你已经说过你想要一个C阵列,我会特别回答你的要求。

  std::map<int,int> some_map;

  int * c_array=new int[some_map.size()];
  size_t k=0;
  for (std::map<int,int>::iterator i=some_map.begin();
       i != some_map.end(); ++i)
    {
      c_array[k++]=(*i).second;
    }
  delete[] c_array;

正如其他人所说,C ++的标准将是向量。我想补充一点,你想要事先保留适当的空间,因为你已经知道了。可以通过c-tor为矢量保留它。

  std::map<int,int> some_map;
  std::vector<int>  some_vector(some_map.size());
  for (std::map<int,int>::iterator i=some_map.begin();
       i != some_map.end(); ++i)
    {
      some_vector.push_back((*i).second);
    }