多くの人が の変種を見せてくれました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
これまでに遭遇した最小値を保持するために使用した変数を削除していることに気付くでしょう。これを行ったのは、私の経験では、2 つの異なるものを同期させておく必要があると、微妙なバグの原因になる可能性があるためです。この単純なケースでさえ、それは複数のバグの原因でした。そのうちの少なくとも 1 つは、n
が宣言されてint
いたのに、その中に型の値を代入double
していたことです。
結論:n
変数を使用せずに、インデックスだけを追跡します。
更新: もちろん、C++17 では、この質問に対する真に受け入れられる唯一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;
}