27

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

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

但是不工作,我该怎么办?

4

7 回答 7

94

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 版本

于 2012-10-22T16:48:10.847 回答
47

您始终可以使用 stl:

auto min_value = *std::min_element(v.begin(),v.end());
于 2012-10-22T16:58:47.877 回答
13
#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]第一个元素被隐式初始化为零。因此循环条件第一次为假,循环根本不运行;您的代码只是打印出第一个元素。

一些小问题:

  • 避免使用原始数组;它们的行为奇怪且不一致(例如,隐式转换为指向数组第一个元素的指针,不能赋值,不能按值传递给函数/从函数返回)

  • 避免幻数。int v[100]如果您希望您的数组从某个地方获取输入然后尝试处理 100 多个元素,那么这是一个 bug 的邀请。

  • 避免using namespace std;在实现文件中没什么大不了的,虽然 IMO 最好习惯于显式限定,但如果你在任何地方盲目使用它可能会导致问题,因为你会将它放在头文件中并开始引起不必要的名称冲突。

于 2012-10-22T16:48:44.230 回答
10

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

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

应该

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

因为您想搜索n向量中的位置,而不是v[n]位置(这没有任何意义)

于 2012-10-22T16:49:50.243 回答
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;
}
于 2012-10-22T17:26:33.990 回答
1

试试这个

 std::min_element(v.begin(),v.end())
于 2012-10-22T16:49:45.777 回答
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;;
}
于 2012-10-22T17:30:26.080 回答