如何在C ++中找到向量对中的最小元素?

时间:2018-12-04 18:44:38

标签: c++

如果向量为<0,8> <0,3> <1,4> <2,9> <3,5>

假设仅需考虑对值的第二个键来找到最小值, 这里是3。

输出: sample.cpp:在函数'int main()'中:sample.cpp:24:45:错误:无法在初始化int i1 = * std :: min_element(v.begin( ),鬻());

3 个答案:

答案 0 :(得分:2)

您可以通过手工制作的for循环或使用Lambda使用STL std::min_element来完成。您上面使用它的方式不正确。这是正确的方法:

auto v = std::vector<std::pair<int,int>>{{0,8},{0,3},{1,4},{2,9},{3,5}};
auto result = *std::min_element(v.cbegin(), v.cend(), [](const auto& lhs, const auto& rhs) {
        return lhs.second < rhs.second;    
    });
std::cout << result.first << " " << result.second  << std::endl; // 0 3

您可以尝试使用此online here,甚至可以尝试一下以了解lambda的工作原理。
std::min_element对于本机类型将按照您使用它的方式正常工作,但是对于像std::pair这样的派生类型,其自定义条件是仅选择第二个,您需要通过lambda提供条件。
我建议您阅读C ++ lambda-通常它们非常方便,但是特别是在需要提供像您这样的自定义谓词时!这是另一个示例:C++ priority queue in ascending order by specific method for objects

答案 1 :(得分:1)

您可以使用min_element并使其仅测试第二个元素。

类似的东西:

std::get<1>(*std::min_element(begin(v), end(v), [](auto lhs, auto rhs){return std::get<1>(lhs)<std::get<1>(rhs)}));

我在这里使用get是因为我不知道您使用的是对还是元组。

由于它仍然是非常小的结构,因此无需通过const&。

答案 2 :(得分:0)

因此,向量看起来像这样:

vector<pair <int, int> > items = { <0,8> <0,3> <1,4> <2,9> <3,5> };

我们需要遍历所有项目以找到最小的第二个项目。为此:

int saveIndex = 0
//now we can loop through all of the items in the vector
for(int i = 1; i < items.size(); i++)
{
    if(items[saveIndex].second > items[i].second)
    {
        saveIndex = i;
    }
}

//the smallest second value will be found at
int smallestValue = items[saveIndex].second;