web-dev-qa-db-ja.com

C ++文字列配列のソート

私はC++ライブラリからソート関数を理解しようとすると、a-zからこの文字列の配列をソートしようとするのに非常に苦労しています、助けてください!!

私はこれを使うように言われましたが、私が間違っていることを理解することはできません。

// std::sort(stringarray.begin(), stringarray.end());

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;

int main()
{
  int z = 0;
  string name[] = {"john", "bobby", "dear", 
                   "test1", "catherine", "nomi", 
                   "shinta", "martin", "abe", 
                   "may", "zeno", "zack", "angeal", "gabby"};

  sort(name[0],name[z]);

  for(int y = 0; y < z; y++)
  {
    cout << name[z] << endl;
  }
  return 0;
}
16
ssj3goku878
int z = sizeof(name)/sizeof(name[0]); //Get the array size

sort(name,name+z); //Use the start and end like this

for(int y = 0; y < z; y++){
    cout << name[y] << endl;
}

編集:

すべての「適切な」命名規則を考慮する(コメントによる):

int N = sizeof(name)/sizeof(name[0]); //Get the array size

sort(name,name+N); //Use the start and end like this

for(int i = 0; i < N; i++){
    cout << name[i] << endl;
}

注: DietmarKühlの答えはあらゆる点で最高です。std::begin()std::end()は、C++ 11のstd::sortのような関数に使用する必要があります。定義できます。

11
P0W

アルゴリズムは、シーケンスの最初から最後までイテレータを使用します。つまり、次のようなstd::sort()を呼び出す必要があります。

_std::sort(std::begin(name), std::end(name));
_

C++ 11を使用せず、std::begin()std::end()がない場合、それらは簡単に定義できます(明らかに名前空間stdにはありません) ):

_template <typename T, std::size_t Size>
T* begin(T (&array)[Size]) {
    return array;
}
template <typename T, std::size_t Size>
T* end(T (&array)[Size]) {
    return array + Size;
}
_
28
Dietmar Kühl

Std :: vectorを使用した例

_#include <iostream>
#include <string>
#include <algorithm>
#include <vector>

int main()
{
    /// Initilaize vector using intitializer list ( requires C++11 )
    std::vector<std::string> names = {"john", "bobby", "dear", "test1", "catherine", "nomi", "shinta", "martin", "abe", "may", "zeno", "zack", "angeal", "gabby"};

    // Sort names using std::sort
    std::sort(names.begin(), names.end() );

    // Print using range-based and const auto& for ( both requires C++11 )
    for(const auto& currentName : names)
    {
        std::cout << currentName << std::endl;
    }

    //... or by using your orignal for loop ( vector support [] the same way as plain arrays )
    for(int y = 0; y < names.size(); y++)
    {
       std:: cout << names[y] << std::endl; // you were outputting name[z], but only increasing y, thereby only outputting element z ( 14 )
    }
    return 0;

}
_

http://ideone.com/Q9Ew2l

これにより、プレーン配列の使用が完全に回避され、std :: sort関数を使用できます。 _= {...}_を使用するようにコンパイラを更新する必要がある場合があります。代わりにvector.Push_back("name")を使用して追加できます。

8
olevegard

カウンタzが0であるため(および0 <0はfalseに評価されるため、ループは開始されないため)、ループは何もしません。

代わりに、C++ 11にアクセスできる場合(そして実際にそれを目指してください!)、イテレータを使用してみてください。非メンバー関数std::begin()およびstd::end()を使用して、結果を表示するためにrange-forループを使用します。

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;

int main() 
{
    int z = 0;
    string name[] = {"john", "bobby", "dear", "test1", "catherine", "nomi", "shinta", "martin", "abe", "may", "zeno", "zack", "angeal", "gabby"};

    sort(begin(name),end(name));

    for(auto n: name){
         cout << n << endl;
    }
    return 0;    
}

実際の例 .

4
TemplateRex

ここで多くの人が述べているように、std :: sortを使用してソートできますが、たとえばz-aからソートしたい場合はどうなりますか?このコードは役に立つかもしれません

bool cmp(string a, string b)
{
if(a.compare(b) > 0)
    return true;
else
    return false;
}

int main()
{
string words[] = {"this", "a", "test", "is"};
int length = sizeof(words) / sizeof(string);
sort(words, words + length, cmp);

for(int i = 0; i < length; i++)
    cout << words[i] << " ";
cout << endl;
    // output will be: this test is a 

}

ソートの順序を逆にする場合は、cmp関数の記号を変更するだけです。

これが役立つことを願っています:)

乾杯!!!

2
nelt22

これは私のために働く:

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

using namespace std;

int main() {
    string name[] = {"john", "bobby", "dear", "test1", "catherine", "nomi", "shinta", "martin", "abe", "may", "zeno", "zack", "angeal", "gabby"};

    int sname = sizeof(name)/sizeof(name[0]);

    sort(name, name + sname);

    for(int i = 0; i < sname; ++i)
        cout << name[i] << endl;

    return 0;
}
2
lpapp

マルチセットコンテナは、赤黒ツリーを使用して要素のソートを維持します。

// using the multiset container to sort a list of strings.
#include <iostream>
#include <set>
#include <string>
#include <vector>


std::vector<std::string> people = {
  "Joe",
  "Adam",
  "Mark",
  "Jesse",
  "Jess",
  "Fred",
  "Susie",
  "Jill",
  "Fred", // two freds.
  "Adam",
  "Jack",
  "Adam", // three adams.
  "Zeke",
  "Phil"};

int main(int argc, char **argv) {
  std::multiset<std::string> g(people.begin(), people.end()); // """sort"""
  std::vector<std::string> all_sorted (g.begin(), g.end());
  for (int i = 0; i < all_sorted.size(); i++) {
    std::cout << all_sorted[i] << std::endl;
  }
}

サンプル出力:

Adam
Adam
Adam
Fred
Fred
Jack
Jess
Jesse
Jill
Joe
Mark
Phil
Susie
Zeke

利点は、挿入および削除後もマルチセットがソートされたままになることであり、アクティブな接続などの表示に最適です。

1
zettix

Sort()関数を使用して、文字列配列をソートできます。

手順:

  1. 最初にサイズ文字列配列を決定します。

  2. sort関数を使用します。 sort(array_name、array_name + size)

  3. 文字列配列を反復処理します/


コードスニペット

#include<bits/stdc++.h>
using namespace std;

int main()
{
    ios::sync_with_stdio(false);

    string name[] = {"john", "bobby", "dear", "test1", "catherine", "nomi", "shinta", "martin", "abe", "may", "zeno", "zack", "angeal", "gabby"};

    int len = sizeof(name)/sizeof(name[0]);

    sort(name, name+len);

    for(string n: name)
    {
         cout<<n<<" ";
    }
    cout<<endl;

    return 0;
}
0
rashedcs