【问题标题】:How to iterate over a STL map (find all possible pairs)如何迭代 STL 映射(找到所有可能的对)
【发布时间】:2013-10-11 14:43:04
【问题描述】:

如何遍历 STL 映射以面对所有元素。换句话说,我想找到所有可能的配对。我想要一个高效的算法(复杂性)。

如果有 STL 向量,算法很简单。

vector<int> vInt;
vector<pair<int, int> > vPair;
for(int i = 0; i < vInt.size(); i++) {
    for(int j = i + 1; j < vInt.size(); j++) {
        vPair.push_back(make_pair(vInt[i], vInt[j]));
    }
}

但是,如果你有一个 STL 映射作为算法呢?

Obs:我想要 map 的所有可能的组合值(不是键)

map<int, int> map;
vector<pair<int, int> > vPair;
???

我想过在 STL 向量中转换为 STL 映射,但是我会采用仅使用 STL 映射的方法

【问题讨论】:

  • 根据定义,对于大小为 n 的映射,映射中的对数为 n*(n-1)/2。因此,没有比向量算法更有效的算法了。
  • 所有可能的映射对或键或值的组合?
  • 我想在 STL 向量中转换为 STL 映射,但是我会采用仅使用 STL 映射的方法

标签: c++ map


【解决方案1】:

“我想要 map 的所有可能组合的值(不是键)”

我不确定您想要什么,但如果您想完全按照您在示例中对矢量所做的操作,请在地图的“值”上

你可以这样做:

std::map<int, int> map;
std::map<int,int>::iterator i,j,end=m.end();  
std::vector<std::pair<int,int> > vpair;
end--;
for(i=m.begin();i!=end;++i)
{
    j=i;
    j++;
    for(;j!=m.end();++j)
        vpair.push_back(std::make_pair(i->second,j->second));
 }

【讨论】:

  • 我会使用const_iterator
  • @Naszta 是的,当然,这个想法只是为了展示它的可能性
【解决方案2】:

你可以使用j = std::next(i)来实现j = i + 1,那么代码就和vector case差不多了:

std::map<int, int> map;
vector<pair<int, int>> vPair;
for (auto i = map.begin(); i != map.end(); i++) {
  for (auto j = std::next(i); j != map.end(); j++) {
    vPair.push_back(std::make_pair(i->second, j->second));
  }
}

【讨论】:

    【解决方案3】:

    非常简单的地图有开始和结束迭代器,就像矢量一样,所以你可以这样做。

    #include <map>                                                                     
    int main()                                                                         
    {                                                                                  
        std::map<int,int> map;                                                         
        for (auto p : map) {                                                           
            auto f = p.first;                                                          
            auto s = p.second;                                                         
        }                                                                              
        return 0;                                                                      
    }     
    

    即使std::unordered_map 也有开始和结束迭代器,但它不像地图那样保留顺序。

    您的问题不清楚您是否想要向量中数字的笛卡尔积,我只能说如果这是您想要的,那么您的原始方法是否比使用地图更好。

    【讨论】:

    • 也许 OP 需要地图内所有可能的元素组合
    • @P0W 显然如果他想要笛卡尔积,他不应该使用地图
    • 系统已有STL图,不能修改。我想过在 STL 向量中转换为 STL 映射,但是我会采用仅使用 STL 映射的方法
    【解决方案4】:

    使用begin()end() 来迭代vectormap 的所有元素。

    for (std::map<int, int>::iterator it = mymap.begin(); it != mymap.end(); ++it)
    {
        std::cout << it->first << "  => " << it->second << '\n';
    }
    

    【讨论】:

      【解决方案5】:

      我喜欢这种方法。

      map<int, int> m;
      m[1] = 1;
      m[2] = 2;
      m[3] = 3;
      m[4] = 4;
      map<int, int>::iterator itr1;
      for(itr1 = m.begin(); itr1 != m.end(); ++itr1) {
          map<int, int>::iterator itr2 = itr1;
          for(++itr2; itr2 != m.end(); ++itr2) {
              cout << m[itr1->second] << " : " << m[itr2->second] << endl;
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2011-05-29
        • 2011-05-11
        • 2011-04-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-18
        • 2010-09-27
        • 1970-01-01
        相关资源
        最近更新 更多