循环向量图并在 C++ 中获得跨列的最大值
loop over map of vectors and get max across columns in c++
我有一个地图定义如下:
const map<int, vector<float> >& m = …;
我想遍历列(map.second: 向量的大小)并且在每次迭代中我得到:
1-跨map.first列的最大值:int
2- map.first 的值:出现最大值的整数
例如:
#0 我得到 31, 1
#1 我得到 15, 2
#2 我得到 18, 2
最简单的方法是什么?
您需要一个接受列号并遍历每一行计算该列最大值的函数。
你只需要一个循环,因为你可以通过像数组一样索引向量来访问你想要的任何列(只要你检查向量是否有足够的元素)
有两种方法可以做到这一点:C++17 方法,您可以将具有多个值的对象直接分配给多个变量,以及您引用 std::pair 成员的旧方法。
C++17 方式:
#include <map>
#include <vector>
#include <utility>
#include <iostream>
std::pair<int,float> column_max(const auto & m, int column)
{
int index = -1;
float maximum = -std::numeric_limits<float>::max();
for (const auto & [key,value] : m)
if (value.size() > column && value[column] > maximum)
{
index = key;
maximum = value[column];
}
return {index,maximum};
}
int main()
{
const std::map<int,std::vector<float>> m =
{
{0, { 1, 5, 10, 22}},
{1, {31, 5, 10, 12}},
{2, { 1, 15, 18, 12}}
};
for (int i=0; i<4; i++)
{
const auto [index,maximum] = column_max(m,i);
std::cout << "#" << i << ": " << maximum << " " << index << "\n";
}
return 0;
}
在这里试试:https://onlinegdb.com/O5dmPot34
以及等效但更旧的方法:
#include <map>
#include <vector>
#include <utility>
#include <iostream>
#include <float.h>
std::pair<int,float> column_max(const std::map<int,std::vector<float>> & m, int column)
{
int index = -1;
float maximum = -FLT_MAX;
for (std::map<int,std::vector<float>>::const_iterator entry=m.begin(); entry!=m.end(); entry++)
if (entry->second.size() > column && entry->second[column] > maximum)
{
index = entry->first;
maximum = entry->second[column];
}
return std::make_pair(index,maximum);
}
int main()
{
const std::map<int,std::vector<float>> m =
{
{0, { 1, 5, 10, 22}},
{1, {31, 5, 10, 12}},
{2, { 1, 15, 18, 12}}
};
for (int i=0; i<4; i++)
{
std::pair<int,float> value = column_max(m,i);
std::cout << "#" << i << ": " << value.second << " " << value.first << "\n";
}
return 0;
}
我有一个地图定义如下:
const map<int, vector<float> >& m = …;
我想遍历列(map.second: 向量的大小)并且在每次迭代中我得到:
1-跨map.first列的最大值:int
2- map.first 的值:出现最大值的整数
例如:
#0 我得到 31, 1
#1 我得到 15, 2
#2 我得到 18, 2
最简单的方法是什么?
您需要一个接受列号并遍历每一行计算该列最大值的函数。
你只需要一个循环,因为你可以通过像数组一样索引向量来访问你想要的任何列(只要你检查向量是否有足够的元素)
有两种方法可以做到这一点:C++17 方法,您可以将具有多个值的对象直接分配给多个变量,以及您引用 std::pair 成员的旧方法。
C++17 方式:
#include <map>
#include <vector>
#include <utility>
#include <iostream>
std::pair<int,float> column_max(const auto & m, int column)
{
int index = -1;
float maximum = -std::numeric_limits<float>::max();
for (const auto & [key,value] : m)
if (value.size() > column && value[column] > maximum)
{
index = key;
maximum = value[column];
}
return {index,maximum};
}
int main()
{
const std::map<int,std::vector<float>> m =
{
{0, { 1, 5, 10, 22}},
{1, {31, 5, 10, 12}},
{2, { 1, 15, 18, 12}}
};
for (int i=0; i<4; i++)
{
const auto [index,maximum] = column_max(m,i);
std::cout << "#" << i << ": " << maximum << " " << index << "\n";
}
return 0;
}
在这里试试:https://onlinegdb.com/O5dmPot34
以及等效但更旧的方法:
#include <map>
#include <vector>
#include <utility>
#include <iostream>
#include <float.h>
std::pair<int,float> column_max(const std::map<int,std::vector<float>> & m, int column)
{
int index = -1;
float maximum = -FLT_MAX;
for (std::map<int,std::vector<float>>::const_iterator entry=m.begin(); entry!=m.end(); entry++)
if (entry->second.size() > column && entry->second[column] > maximum)
{
index = entry->first;
maximum = entry->second[column];
}
return std::make_pair(index,maximum);
}
int main()
{
const std::map<int,std::vector<float>> m =
{
{0, { 1, 5, 10, 22}},
{1, {31, 5, 10, 12}},
{2, { 1, 15, 18, 12}}
};
for (int i=0; i<4; i++)
{
std::pair<int,float> value = column_max(m,i);
std::cout << "#" << i << ": " << value.second << " " << value.first << "\n";
}
return 0;
}