如何从向量中找到最小值?

时间:2012-10-22 16:44:54

标签: c++

如何从矢量中找到最小值?

int main()
{
    int v[100] = {5,14,2,4,6};
    int n = 5;
    int mic = v[0];
    for(int i=0;i<v[n];i++)
    {
        if(v[i]<mic)
        mic=v[i];
    }
    cout<<mic;
}

但是不起作用,我该怎么办?

7 个答案:

答案 0 :(得分:60)

std::min_element(vec.begin(), vec.end()) - 对于std :: vector
std::min_element(v, v+n) - 对于数组
std::min_element( std::begin(v), std::end(v) ) - 在@JamesKanze的评论中添加了C ++ 11版本

答案 1 :(得分:24)

您可以随时使用stl:

auto min_value = *std::min_element(v.begin(),v.end());

答案 2 :(得分:11)

#include <iostream>
#include <vector>
#include <algorithm> // std::min_element
#include <iterator>  // std::begin, std::end

int main() {
    std::vector<int> v = {5,14,2,4,6};
    auto result = std::min_element(std::begin(v), std::end(v));
    if (std::end(v)!=result)
        std::cout << *result << '\n';
}

您展示的程序存在一些问题,主要罪魁祸首是for条件:i<v[n]。初始化数组,将前5个元素设置为各种值,其余元素设置为零。 n设置为您显式初始化的元素数,因此v[n]是隐式初始化为零的第一个元素。因此,第一次循环条件为false,循环根本不运行;你的代码只是打印出第一个元素。

一些小问题:

  • 避免原始数组;它们行为异常且不一致(例如,无法分配对数组第一个元素的指针的隐式转换,不能通过值传递给函数/从函数返回)

  • 避免使用魔法数字。 int v[100]是一个bug的邀请,如果你希望你的数组从某个地方获取输入,然后尝试处理超过100个元素。

  • 避免using namespace std;这在实现文件中没什么大不了的,虽然IMO最好习惯明确的资格,但是如果你盲目地在任何地方使用它会导致问题,因为你会把它放到在头文件中并开始导致不必要的名称冲突。

答案 3 :(得分:10)

您的代码中有错误。这一行:

for(int i=0;i<v[n];i++)

应该是

for(int i=0;i<n;i++)

因为您要在向量中搜索n个地方,而不是v[n]个地方(这并不意味着什么)

答案 4 :(得分:4)

template <class ForwardIterator>
ForwardIterator min_element ( ForwardIterator first, ForwardIterator last )
{
    ForwardIterator lowest = first;
    if (first == last) return last;
    while (++first != last)
    if (*first < *lowest) 
        lowest = first;
    return lowest;
}

答案 5 :(得分:1)

尝试使用

 std::min_element(v.begin(),v.end())

答案 6 :(得分:0)

#include <iostream>
int main()
{
    int v[100] = {5,14,2,4,6};
    int n = 5;
    int mic = v[0];
    for(int i = 0; i != n; ++i)
    {
        if(v[i] < mic)
        mic = v[i];
    }
    std:cout << mic << std::endl;;
}