了解数组c ++中最小值位置的最简单方法

Posted

技术标签:

【中文标题】了解数组c ++中最小值位置的最简单方法【英文标题】:easiest way to know the position of minimum values in array c++ 【发布时间】:2020-10-24 19:42:28 【问题描述】:

我有这段代码,我怎样才能找到读数数组中的最小值位置。 例如,如果最小值是读数 [10],有没有办法我可以编写代码

int count = 0;
long readings[20] = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0;
for (count = 0;count <21;count++;)
readings [count] =  time2[count] + (time3[count] * 60) + ( time4[count] * 3600);

我实际上是在像这样使用 if 语句。 if ( (readings[0] &lt;= readings[1]) &amp;&amp; (readings[2]) ) 但现在我想计算并比较数组中的 20 个数字(读数 [0])和(读数 [20]),如果有一种方法可以让我知道数组中的最小元素位置,我将不胜感激。

【问题讨论】:

您正在尝试使用 for 循环初始化数组的每个元素,现在您想获取数组中最小元素的位置? 嗨,尝试使用标准容器(std::array、std::vector(如果大小不固定))。这些容器有实现的方法。 en.cppreference.com/w/cpp/algorithm/min_element @Celz - 标准算法也适用于原始数组。 std::min_element(std::begin(readings), std::end(readings)) 将给出一个指向最小元素的指针(或第一个找到的元素,如果多个元素具有相同的最小值)。 std::distance(std::begin(readings), std::min_element(std::begin(readings), std::end(readings))) 会将其转换为(有符号的)整数索引。 对于 OP - 从 count = 0 循环到 count &lt; 21 意味着您的代码写到了 readings 的末尾,因此会导致未定义的行为。循环到count &lt; 20。我认为for 中额外的; 是一个错字。 @Peter 很高兴知道,谢谢 【参考方案1】:

std::min_element 将为您完成工作:

auto index = std::distance(std::begin(readings), std::min_element(std::begin(readings), std::end(readings)));

【讨论】:

【参考方案2】:

在我看来,下面的 sn-p 是你应该继续的方式。

tmp_inx = 0;
for(int i = 1; i < 20; i++) 
    if(readings[i]<readings[tmp_inx])
        tmp_inx = i;
    

【讨论】:

【参考方案3】:

是的,只需遍历数组并保存找到最小值的位置。像这样的

long readings[20] = ...;

long min_reading = readings[0];
int min_position = 0;
for (int i = 1; i < 20; ++i)

    if (readings[i] < min_reading)
    
        min_reading = readings[i];
        min_position = i; // save minimum position
    

cout << "the minimum position is " << min_position << endl;

【讨论】:

int i = 1?不应该是零吗? 否,因为您已经考虑了 for 循环之前两行中的零读数。【参考方案4】:

你可以用这个方法找到沿着最小数组位置的最小元素:

#include <iostream>

int main(void) 
    // an array example
    long longNumbers[] = 3, 4444, 32, 55, 1, 93, 4;

    // getting the array length
    size_t len = sizeof(longNumbers) / sizeof(longNumbers[0]);

    // intentionally declared to be used for position
    int pos = 0;

    // assuming the first index as the smallest initially
    int smallest = longNumbers[pos];

    // iterating till 'len'
    for (size_t i = 1; i < len; i++)
        // if smallest is still greater than some value
        // then deduce it
        if (smallest > longNumbers[i]) 
            smallest = longNumbers[i];
            pos = i;
        
    
    std::cout << "The smallest element " << smallest
              << " exists in index: " << pos << std::endl;
    
    return 0;


它会给出如下输出:

The smallest element 1 exists in index: 4

表示整个数组集合中最小的元素是1,它位于索引位置4

【讨论】:

@john 怎么样?这正确显示了最小元素和数组索引,并且我在编译期间使用了-Wall 标志,也没有报告任何警告。 您的代码仅在最小数字前面是按降序排序的数字(如您的示例中)时才有效,否则它将返回不正确的索引,例如godbolt.org/z/-h5H4N @AlanBirtles 答案已更新。现在它似乎工作正常。 @RohanBari 代码仍然不正确,现在您有loc 计算不等于最小元素的元素数量。对我来说,当您需要某物的索引时使用基于范围的循环的整个想法是错误的。 @john 那么也许我们需要使用 STL 算法或简单的 for 循环。

以上是关于了解数组c ++中最小值位置的最简单方法的主要内容,如果未能解决你的问题,请参考以下文章

C++ 将单个元素移动到向量中的新位置的最简单最有效的方法

确定寄存器的值是否等于零的最简单方法是什么?

从数据框中的所有列中获取值的最简单方法是啥[重复]

数组排序是啥?

从每个参数中删除尾部斜杠的最简单方法是啥?

选择排序详解