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

时间:2014-12-02 10:39:28

标签: c++ vector

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

vector<vector<float> > vec;

上面的向量有一个矩阵(我的程序从csv文件读取数据并作为矩阵输入这些向量的向量),这样我想检查向量向量中的特定列并找到最小值和最大值在该特定列中,请记住从指定的向量的特定列中查找min和max。

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

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;
}

但是如果向量有另一个向量,如vector<vector<float> > vec;

,该怎么办?

2 个答案:

答案 0 :(得分:1)

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

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;
}

<强>输出

  

第2位的Max元素为30

     

min元素在位置1处为2

live demo

答案 1 :(得分:0)

一种选择是覆盖&lt;与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];