有很多人向您展示了他们的indexofSmallestElement
变体。我将包括我的版本,并解释为什么我认为它更好:
int indexofSmallestElement(double array[], int size)
{
int index = 0;
for(int i = 1; i < size; i++)
{
if(array[i] < array[index])
index = i;
}
return index;
}
你会注意到,我取消了变量
n
,这个变量是用来保存目前为止遇到最小值的。我这样做是因为,在我的经验中,必须保持两个不同的东西同步可能会导致微妙的错误。即使在这个简单的情况下,它也是多个错误的源头,其中一个是你声明了
n
为int类型,但是你给它赋的值是double类型。
底线:取消
n
变量,只跟踪一个东西:索引。
更新:当然,毫无疑问,使用C++17,这个问题的唯一合理答案是使用
std::min_element
函数:
std::min_element
。
#include <iostream>
#include <algorithm>
#include <iterator>
#include <cstdint>
#include <array>
#include <vector>
template <typename Iter>
auto indexofSmallestElement(Iter first, Iter last)
{
return std::distance(first,
std::min_element(first, last));
}
template <typename T, std::size_t N>
auto indexofSmallestElement(std::array<T, N> arr)
{
return std::distance(std::begin(arr),
std::min_element(std::begin(arr), std::end(arr)));
}
template <typename T>
auto indexofSmallestElement(std::vector<T> vec)
{
return std::distance(std::begin(vec),
std::min_element(std::begin(vec), std::end(vec)));
}
int main(int, char **)
{
int arr[10] = { 7, 3, 4, 2, 0, 1, 9, 5, 6, 8 };
auto x = indexofSmallestElement(std::begin(arr), std::end(arr));
std::cout
<< "The smallest element in 'arr' is at index "
<< x << ": " << arr[x] << "\n";
std::array<float, 5> fa { 0.0, 2.1, -1.7, 3.3, -4.2 };
auto y = indexofSmallestElement(fa);
std::cout
<< "The smallest element in 'fa' is at index "
<< y << ": " << fa[y] << "\n";
return 0;
}
<= size
这是不正确的——你应该使用< size
。请记住,在C和C++中,数组从0开始,因此如果您的数组有10个项目,则有效索引为0、1、2、...、9。另外,你的index
变量可能未初始化。想一想当最小元素是第一个元素时会发生什么。 - Nik Bougalisfor (int i = 0; i <= size; i++)
。应该改为<
。 - Matthew Lundberg