1

如何迭代 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<int, int> map;
vector<pair<int, int> > vPair;
???

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

4

5 回答 5

2

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

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

你可以这样做:

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));
 }
于 2013-10-11T15:08:44.290 回答
2

可以用j = std::next(i)to 来实现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));
  }
}
于 2019-11-22T21:29:58.550 回答
1

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

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

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

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

于 2013-10-11T14:47:00.820 回答
0

我喜欢这种方法。

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;
    }
}
于 2013-10-11T15:03:15.203 回答
0

使用begin()and , both 来迭代 a和 a 的end()所有元素。vectormap

for (std::map<int, int>::iterator it = mymap.begin(); it != mymap.end(); ++it)
{
    std::cout << it->first << "  => " << it->second << '\n';
}
于 2013-10-11T14:48:01.537 回答