dポイントプレゼントキャンペーン実施中!

C++文字配列ソート関数を教えてください

配列に格納されている文字列をソートして完全一致するかを確認するロジックを作成したいのですが、上手くいきません。ネットなどでいろいろ調べたのですが><

一応、以下に今の状態のソースを貼りました。



class StringSuzeLess
{
public;
bool operator()( const std::string& Ihs, const std::string& rhs ) const
{
retrun ihs.size() < rhs.size();
}
}

int main()
{
// 文字列格納変数
chra str1[10][5+1];
char str2[10][5+1];

// 初期化
memset(str1, 0x00, sizeof(str1));
memset(str2, 0x00, sizeof(str2));

// 文字列設定
strcpy(str1[0], "AAAAA");
strcpy(str1[1], "BBBBB");
strcpy(str1[2], "CCCCC");

strcpy(str2[0], "CCCCC");
strcpy(str2[1], "BBBBB");
strcpy(str2[2], "AAAAA");

std::vector< std::string > vsmozi1;
std::vector< std::string > vsmozi2;

// ベクタに文字列設定
for(short LoopCnt = 0; LoopCnt < 3; LoopCnt++)
{
vsmozi1.push_back( std::string( str1[LoopCnt] ) );
}
for(short LoopCnt = 0; LoopCnt < 3; LoopCnt++)
{
vsmozi2.push_back( std::string( str2[LoopCnt] ) );
}

// ソート
std::stable_sort( vsmozi1.begin(), vsmozi1.end(), StringSuzeLess());
std::stable_sort( vsmozi2.begin(), vsmozi2.end(), StringSuzeLess());

// ソート後の先頭から取得
for(short LoopCnt = 0; LoopCnt < 3; LoopCnt++)
{
// 不一致の場合
if(vsmozi1[LoopCnt] != vsmozi2[LoopCnt])
{
return -1;
}
}

return 0;
}

A 回答 (2件)

なにがどう「うまくいかない」のですか?

    • good
    • 0

なぜ、StringSuzeLess::()内で


size()を比較しているのでしょうか?
文字列の長さ順にソートしたいのですか?
全部同じ長さですから、ソート前後で変化無いですよね。

この仕様なのでしょうか?

他にも明らかなミスがあります。

修正したソースを載せます。
文字列順で比較するよう仕様変更しました。

本来の仕様に合致しているか保障の限りではありません。
(長さ順のソートが正しい仕様かも・・・)

//// ここからソース //////////////////////////////////

// ヘッダを追加しました
#include <string>
#include <vector>
#include <algorithm>

class StringSuzeLess
{
public:
// 些細なことですがrhsに対してはl(エル)hsではないでしょうか?
bool operator()( const std::string& lhs, const std::string& rhs ) const
{

//return lhs.size() < rhs.size();
return lhs < rhs;
}
// クラスの終わりにセミコロンがありません
};

int main()
{
// 文字列格納変数
char str1[10][5+1];
char str2[10][5+1];

// 初期化
memset(str1, 0x00, sizeof(str1));
memset(str2, 0x00, sizeof(str2));

// 文字列設定
strcpy(str1[0], "AAAAA");
strcpy(str1[1], "BBBBB");
strcpy(str1[2], "CCCCC");

strcpy(str2[0], "CCCCC");
strcpy(str2[1], "BBBBB");
strcpy(str2[2], "AAAAA");

std::vector< std::string > vsmozi1;
std::vector< std::string > vsmozi2;

// ベクタに文字列設定
for(short LoopCnt = 0; LoopCnt < 3; LoopCnt++)
{
vsmozi1.push_back( std::string( str1[LoopCnt] ) );
}
for(short LoopCnt = 0; LoopCnt < 3; LoopCnt++)
{
vsmozi2.push_back( std::string( str2[LoopCnt] ) );
}

// ソート
std::stable_sort( vsmozi1.begin(), vsmozi1.end(), StringSuzeLess());
std::stable_sort( vsmozi2.begin(), vsmozi2.end(), StringSuzeLess());

// ソート後の先頭から取得
for(short LoopCnt = 0; LoopCnt < 3; LoopCnt++)
{
// 不一致の場合
if(vsmozi1[LoopCnt] != vsmozi2[LoopCnt])
{
return -1;
}
}

return 0;
}
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!