如何遍历 STL 映射(查找所有可能的对)
How to iterate over a STL map (find all possible pairs)
如何遍历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 映射的方法
"我想要所有可能的组合映射的值(不是键)"
我不确定你想要什么,但是如果你想完全按照你在例子中对矢量所做的那样做,在地图的"值"上
您可以像下面这样操作:
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));
}
可以使用
j = std::next(i)
来实现j = i + 1
,那么代码几乎和向量情况相同:
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));
}
}
非常简单,地图就像向量一样具有开始和结束迭代器,因此您可以执行此操作。
#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
也有开始和结束迭代器,但它不像地图那样保持秩序。
从你的问题中不清楚你是否想要向量中数字的笛卡尔乘积,我只能说,如果这是你想要的,你的原始方法比使用地图更好。
使用 begin()
和 end()
来迭代vector
和map
的所有元素。
for (std::map<int, int>::iterator it = mymap.begin(); it != mymap.end(); ++it)
{
std::cout << it->first << " => " << it->second << 'n';
}
我喜欢这种方法。
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;
}
}
相关文章:
- 有可能在Armadillo中复制MATLAB circshift方法吗
- 在他自己的方法中,有可能将一个对象取消引用到另一个对象吗
- 有可能使shared_ptr协变吗
- 有可能在信号处理程序中设置promise吗
- 是否有可能实现O(N)时间和O(1)空间解决方案,以实现C++中的字符串循环移位
- 是否有可能构建面向Linux和Windows的.Net Core C++ / CLI应用程序?
- 是否有可能使用debug_info获取ELF文件的源代码?
- C++,是否有可能/如何定义在.h和.cpp源文件中调用函数的类构造函数
- 有可能在C++中有类的查找表吗
- 是否有可能让 c++ dll 在后台运行 python 程序并让它填充向量图?如果是这样,如何?
- 向量的大小是否有可能为 1 但其中的元素数量为零?
- 是否有可能编写新的叮当声现代化规则?
- 是否有可能通过指向另一个未关联的子对象的指针来获取指向一个子对象的指针?
- 是否有可能通过演绎指南实现整个 std::make_tuple 功能?
- 是否有可能在没有复制的情况下传递 std::vector<int> 作为参数来获得 std::vector<std::array<int, 3>>?
- 是否有可能具有放入容器的移动操作的类型?
- 是否有可能通过溢出 C 中的第一个元素来写入数组第二个元素
- 声明是否有可能逃脱其封闭的名称空间
- git-是否有互联网上某处所有可能错误的列表
- 是否有可能有一个派生类继承最终函数但创建相同的函数(而不是重写)