C++ 从向量的向量列中获取最小值和最大值

C++ 从向量的向量列中获取最小值和最大值,c++,vector,C++,Vector,我知道如何通过如下所示的迭代器获取向量中的最小值和最大值,但如何获取向量中矩阵表的最小值和最大值:例如,我有: vector<vector<float> > vec; vec; 上面的向量有一个矩阵(我的程序从csv文件读取数据并将这些向量作为矩阵输入),因此我想检查向量向量中的一个特定列,并在该特定列中找到最小值和最大值,记住从指定的向量特定列中查找最小值和最大值 在单个向量中查找最小值和最大值的常规方法是: int main() { std::vector

我知道如何通过如下所示的迭代器获取向量中的最小值和最大值,但如何获取向量中矩阵表的最小值和最大值:例如,我有:

vector<vector<float> > vec;
vec;
上面的向量有一个矩阵(我的程序从csv文件读取数据并将这些向量作为矩阵输入),因此我想检查向量向量中的一个特定列,并在该特定列中找到最小值和最大值,记住从指定的向量特定列中查找最小值和最大值

在单个向量中查找最小值和最大值的常规方法是:

int main()
{
    std::vector<double> v {1.0, 2.0, 3.0, 4.0, 5.0, 1.0, 2.0, 3.0, 4.0, 5.0};

    auto biggest = std::max_element(std::begin(v), std::end(v));
    std::cout << "Max element is " << *biggest
        << " at position " << std::distance(std::begin(v), biggest) << std::endl;

    auto smallest = std::min_element(std::begin(v), std::end(v));
    std::cout << "min element is " << *smallest
        << " at position " << std::distance(std::begin(v), smallest) << std::endl;
}
intmain()
{
向量v{1.0,2.0,3.0,4.0,5.0,1.0,2.0,3.0,4.0,5.0};
自动最大=标准::最大元素(标准::开始(v),标准::结束(v));

std::cout您可以使用的第二种形式编写自己的比较函子,如下所示:

template< class T >
struct ColumnAdapter {
    ColumnAdapter( size_t column ) : m_column( column ) {}
    bool operator()( const std::vector< T > & left, const std::vector< T > & right ) {
        return left.at( m_column ) < right.at( m_column );
    }
private:
    size_t m_column;
};

int main() {
    std::vector< std::vector< int > > v = {
        { 2,  3, 4, 5, 6, 7 },
        { 1,  2, 3, 4, 5, 6 },
        { 20, 30, 40, 50, 60, 70 },
        { 2,  3, 4, 5, 6, 7 },
    };
    const size_t COLUMN = 1;
    auto biggest = std::max_element(std::begin(v), std::end(v), ColumnAdapter< int >( COLUMN ) );
    std::cout << "Max element is " << (*biggest).at( COLUMN )
        << " at position " << std::distance(std::begin(v), biggest) << std::endl;

    auto smallest = std::min_element(std::begin(v), std::end(v), ColumnAdapter< int >( COLUMN ) );
    std::cout << "min element is " << (*smallest).at( COLUMN )
        << " at position " << std::distance(std::begin(v), smallest) << std::endl;  
    return 0;
}
模板
结构柱适配器{
ColumnAdapter(size\u t column):m\u column(column){}
布尔运算符()(常数std::vector左,常数std::vector右){
返回左.at(m_列)<右.at(m_列);
}
私人:
“大小”t mu列;
};
int main(){
std::vector>v={
{ 2,  3, 4, 5, 6, 7 },
{ 1,  2, 3, 4, 5, 6 },
{ 20, 30, 40, 50, 60, 70 },
{ 2,  3, 4, 5, 6, 7 },
};
const size\u t COLUMN=1;
自动最大值=std::max_元素(std::begin(v)、std::end(v)、ColumnAdapter(COLUMN));

std::cout一个选项是覆盖与lambda表达式一起使用的<

size_t col = 1; // tells which column to check
auto comp = [&] (const vector<float> &a, const vector<float> &b)
{
    return a[col] < b[col];
}

//usage

auto max = max_element(mat2d.begin(), mat2d.end(), comp);
float max_val = (*max)[col];
size\u t col=1;//指示要检查的列
自动补偿=[&](常数向量和a、常数向量和b)
{
返回a[col]
我曾想过一种方法,但我需要一个正确的答案,例如,我可以将行设为固定值,然后使用for循环,我可以得到一列的值。然后将这些值存储在新的单个向量中,然后遍历它以找到最小值和最大值。但如果有人能给我一个比创建新的ve更好的解决方案,我将不胜感激我不认为这比用所需列创建一个新的向量或数组更简单。必须有一种方法在矩阵中迭代,就像我们使用迭代来显示矩阵值一样,也必须有一种方法。我只是想不出来。我试过了,但没有luckNote,你有
std::minmax\u元素
调用
std::max_元素
std::min_元素
.G:\UH\PSE\projects\practice\main.cpp:218:3:警告:“自动”更改C++11中的含义;请将其删除[-Wc++0x compat]G:\UH\PSE\projects\practice\main.cpp:218:8:error:“maxist”未命名类型G:\UH\PSE\projects\practice\main.cpp:219:41:error:“maxist”未在此范围内声明G:\UH\PSE\projects\practice\main.cpp:220:45:error:“begin”不是“std”的成员G:\UH\PSE\projects\practice\main.cpp:222:5:警告:“auto”更改C++中的含义;pl轻松删除它[-Wc++0x compat]我所需要做的是:包含“包含”,然后转到“CleLLeLand设置”,选择“G++”,然后按照C++ iSoFiStST:在代码中看到了<代码> Auto <代码>,并认为您打开了C++ 11的特性。第二次我从答案中删除,使其更短,但给了您一个指向“代码> IDENo.COM<代码> >的链接。ee代码是真正的工作。