2016-06-02 21 views
-2

私はこのプロジェクトでこの数日間働いています。私の問題は、それがソート関数になると、それは崩壊することです。私は 'ソート'機能のパラメータがないと感じています。たぶん、味付けした目は私の誤りを見ることができます。目的は、ユーザーに文字列を入力させ、配列class personに適用し、ソートしてコンソールに出力することです。入力セクションは完璧に機能しますが、ソート機能はコンパイルされません。私はその部分を含めませんでしたが、必要ならばそれも投稿します。C++ソートクラス文字列

#include <iostream> 
#include <string> 
#include <algorithm> 

using namespace std; 

//class declaration 

class Person{ 
public: 
    string lastName; 
    string firstName; 
}; 

//variables 

int entry; // defined in other function 
string choice; //defined in other function 

//arrays 

Person nameArray[10]; 

//function declarations 

void sortView(){ 

    sort(nameArray[0].lastName.begin(), nameArray[0].lastName.end() + entry); 

    for (int i = 0; i < entry; i++){ 
     cout << nameArray[i].lastName; 
     cout << ", "; 
     cout << nameArray[i].firstName; 
     cout << endl; 
    } 
}; 
+0

[sort](http://en.cppreference.com/w/cpp/algorithm/sort)のドキュメントを見てください*それはどういう仕組みであるか* – Borgleader

+0

問題はすべてのドキュメントがソートを参照していることですint型のデータ型を使用する場合、この代入では入力は文字列でなければなりません。基本レベルの文字列がint値であることはよく知っていますが、私は何が欠けているのか分かりません。 – Infynix

+0

そう?リンク先のドキュメントは、あなたが必要とする*正確な*カスタム比較関数を使用する方法を示しています。例が文字列ではなくintを使用しているという事実は関係ありません。 – Borgleader

答えて

1

std::sort()は2つの必須パラメータを受け取り:シーケンスを定義する開始イテレータ値と終了イテレータ値をソートします。

std::sort()に渡すものは、イテレータのペアのように遠くは見えません。それはコンパイルされません。

NameArray.lastNameは無効です。C++。 NameArrayは配列です。 .演算子は構造体またはクラスで使用され、配列では使用されません。

は、あなたが通常使用する、この10要素の配列をソートするに:

sort(NameArray, NameArray+10); 

式で、配列の名前を使用すると、あなたの配列の最初の要素へのポインタを与えているという事実を利用して、これらのこのコンテキストでは、ポインタはイテレータと論理的に等価です。

NameArrayの要素をどのように比較できるかは定義されていないため、ここでは機能しません。 NameArrayにはpersonクラスのインスタンスが含まれており、<演算子を使用して異なる値を比較できる場合にのみ、意味のある並べ替えを行うことができます。あなたもどちらかにする必要があります。この配列をソートするために

:、)

1)std::sort(に第三、オプションのパラメータを渡しpersonクラスの2つのインスタンスを比較してラムダを、または

2)personクラスにoperator<メンバーメソッドを実装します。 std::sortについては

1
sort(std::begin(NameArray), std::end(NameArray), [](const person& p1, const person& p2) { 
    // write your sort logic, for example 
    return p1.lastName < p2.lastName; 
}); 

、[OK]をクリックすると、これは配列がどのように動作するかではない2回の反復子とコンペア機能

0

を提供する必要があります。

NameArrayは、配列の最初の要素へのポインタを返します。NameArray + 10は、11番目の要素へのポインタを返しますが、NameArray.lastNameは存在しません。 NameArrayの配列であり、人ではありません。配列の最後の名前は何ですか?

sortNameArrayを適用し、その姓に基づいて並べ替えます。 NameArrayに適用されるので、それは:

sort(NameArray, NameArray + entry)でなければなりません。

これで別のコンパイルエラーが発生します。sorting functionには2つのpersonを比較する方法が必要です(クラス名は大文字で始める必要があります)。

これを行うには2通りの方法があります。 personは、lastNameに基づいて常に他のものより劣っていると考えることができます。この場合、<演算子にpersonがオーバーロードされます。

またはあなたのソート機能に要素を比較するための特別な方法を指定します:

sort(NameArray, NameArray + entry, [](const person &p1, const person &p2) { 
    return p1.lastName < p2.lastName; 
}); 

はもう少し理解するためにsome readingを行い、あなたはまた、ラムダ関数を調べることができます。


PS:大文字で始まる名前は、あなたのクラスであるようにしてください。そのような名前を付ける変数は混乱します。

また、固定サイズのアレイを使用する代わりに、std::vectorまたはstd::valarrayを参照することもできます。