嗨,我正在為我的 c 類做一個問題,我們要為所有型別創建一個通用的選擇排序函式,并使用單獨的函式來找到最小索引。我試圖通過將兩個 for 回圈分成兩個單獨的函式來修改使用兩個 for 回圈的選擇排序函式。我嘗試了不同的方法來解決這個問題,但我只是不明白我做錯了什么。請幫忙。
#include <vector>
#include <random>
#include <iostream>
#include<stdexcept>
#include<time.h>
#include <valarray>
using namespace std;
template <typename T>
unsigned min_index(const vector<T> &vals, unsigned index){
auto min = index;
for(auto i = index 1; i != vals.end();i ){
if(*i < *min)
min = i;
}
return min;
}
template <typename T>
void selection_sort(vector<T> &vals){
for(auto i=vals.begin(); i!=vals.end(); i ){
auto min = min_index(vals, i);
swap(*i, *min);
}
}
uj5u.com熱心網友回復:
您正在嘗試開發基于位置索引的min_index(它本身已經嚴重損壞),然后在基于迭代器的選擇排序中使用它。
template <typename T>
unsigned min_index(const vector<T> &vals, unsigned index)
{
auto min = index; // min is 'unsigned' like 'index'
// this loop is nonsense.
// 'i' is unsigned (because 'index' is unsigned)
// 'vals.end()' is an iterator, not an unsigned, therefore...
// 'i != vals.end()` is nonsense.
// 'min' is also unsigned, therefore...
// both *i and *min are nonsense.
for(auto i = index 1; i != vals.end();i )
{
if(*i < *min)
min = i;
}
return min;
}
稍后,在您的選擇排序中...
template <typename T>
void selection_sort(vector<T> &vals){
// here 'i' is an iterator
for(auto i=vals.begin(); i!=vals.end(); i )
{
// here you're trying to pass an iterator to a function
// expecting an unsigned.
auto min = min_index(vals, i);
// and the above function is returning an unsigned
// therefore *min is nonsense.
swap(*i, *min);
}
}
簡而言之,這些函式都不可能編譯,更不用說作業了。
您需要選擇其中一個并堅持下去。這是 C ,所以最容易實作的可能是迭代器版本。作為獎勵,它也最終成為最通用的(現代 C 中到處都有迭代器)。例如min_index,重寫為min_iter的 可能如下所示:
template<class Iter>
Iter min_iter(Iter beg, Iter end)
{
auto min = beg;
for (; beg != end; beg)
{
if (*beg < *min)
min = beg;
}
return min;
}
現在您也可以在基于迭代器的選擇排序中使用它:
template <class Iter>
void selection_sort(Iter beg, Iter end)
{
for (; beg != end; beg)
std::iter_swap(beg, min_iter(beg, end));
}
最后,您可以通過使用標準庫中的通用std::begin和函式來使用通用序列抽象來處理它:std::end
template<class Seq>
void selection_sort(Seq& seq)
{
selection_sort(std::begin(seq), std::end(seq));
}
現在你可以傳遞一個向量、一個雙端佇列、一個陣列等。幾乎任何序列容器實體都可以作業,只要底層元素型別支持operator <本機或多載。
基于位置
特定于您的容器型別(向量)和序號位置而不是迭代器的類似解決方案將是這樣的:
template <typename T>
unsigned min_index(const std::vector<T> &vals, unsigned index)
{
unsigned min = index;
for (unsigned i = index 1; i < vals.size(); i )
{
if (vals[i] < vals[min])
min = i;
}
return min;
}
template <typename T>
void selection_sort(std::vector<T> &vals)
{
for (unsigned i = 0; i < vals.size(); i )
std::swap(vals[i], vals[min_index(vals, i)]);
}
uj5u.com熱心網友回復:
這就是我現在所擁有的,但我在評分網站上遇到了未知錯誤(在我的編譯器上運行良好)。使用 int 向量和 double 向量時出現未知錯誤,使用字串向量時出現錯誤值。有人看到我應該解決的任何問題嗎?
對于字串:
預期:b edmb ghnh irlwv ko kuc ngpo ogrme qgls qlk rgj ryy sos uchfm uwk wus x
實際: b edmb ghnh irlwv ko qlk kuc ngpo ogrme qgls rgj ryy sos uchfm uwk x wus
template <typename T>
unsigned min_index(const vector<T> &vals, unsigned index){
T min = vals[index];
unsigned mindex;
for(unsigned i = index 1; i < vals.size();i ){
if(vals[i] < min){
min = vals[i];
mindex=i;
}
}
return mindex;
}
template <typename T>
void selection_sort(vector<T> &vals){
for(unsigned i=0; i < vals.size(); i ){
unsigned min = min_index(vals, i);
swap(vals[i],vals[min]);
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/462130.html
