web-dev-qa-db-ja.com

どうすればstd :: vector <std :: string>をビルドしてからソートできますか?

並べ替える必要がある文字列がたくさんあります。これを行うには、std :: vectorが最も簡単な方法だと思います。ただし、ベクターを使用したことがないため、何か助けが必要です。

アルファベット順に並べるだけで、特別なことは何もありません。実際、string :: compare関数は機能します。

その後、どのようにそれらを繰り返してソートされていることを確認できますか?

ここに私が持っているものがあります:

std::sort(data.begin(), data.end(), std::string::compare);

for(std::vector<std::string>::iterator i = data.begin(); i != data.end(); ++i)
{
    printf("%s\n", i.c_str);
}
32
samoz

あなたはできる

_std::sort(data.begin(), data.end());
_

そして、それはあなたの文字列をソートします。次に、それらが順番に並んでいるかどうかを確認します

_if(names.empty())
    return true; // empty vector sorted correctly
for(std::vector<std::string>::iterator i=names.begin(), j=i+1; 
        j != names.end(); 
        ++i, ++j)
    if(*i > *j)
        return false;
return true; // sort verified
_

特に、_std::string::compare_はコンパレータとして使用できませんでした。これは、sortが望んでいることを実行しないためです。最初の引数が2番目の引数より小さい場合はtrueを返し、falseを返しますさもないと。上記のようにsortを使用する場合は、_operator<_を使用します。これはまさにそれを行います(つまり_std::string_はfirst.compare(second) < 0を返します)。

質問は何ですか?すべてがすでにそこにあるようです。

ただし、おそらく_std::cout << *i << std::endl;_を使用する必要があります

  1. iはイテレータ==コンテナ内のデータへのポインタなので、_*_が必要です
  2. c_str()は_std::string_の関数であり、変数ではありません

あなたのコードの問題はあなたの質問に関係しませんか?

あなたのためのいくつかのヒント:

  • _std::vector_は_[]_演算子もオーバーライドするため、代わりにイテレータの手間を省いて配列のように使用できます(_0_からvector.size()に繰り返します)。
  • 代わりに_std::set_を使用すると、挿入時に自動的にソート(バイナリツリー)されるため、余分なソートを保存できます。
  • ファンクターを使用すると、出力がさらに楽しくなります:copy(V.begin(), V.end(), ostream_iterator<std::string>(cout, "\n"));
3
ypnos

ソート用:
_std::sort_またはstd::vector< std::string>::sort(..)メソッド。
ソートされているかどうかを確認するには:
_std::is_sorted_を使用してチェックをソートします- http://www.sgi.com/tech/stl/is_sorted.html
または
std::adjacent_find( v.begin(), v.end(), std::greater< std::string >() ) == v.end()

あなたの場合、デフォルトのコンパレータを使用できます

編集済み:
_std::is_sorted_は標準のstl関数ではなく、sgi stl実装で定義されています。
このメモを@Brian Nealに感謝します。

2
bayda

litb は、いつものように正しいです。

より一般的なポイントを指摘したかっただけです- 何でも <と比較できるものは、std :: sortでソートできます。私はこれを行うことができるように、operator <メンバー関数を構造体に忍び込ませることがあります。

2
Mark Ransom

コンパレータを使用してみてください:

 #include <cmath>
 #include <cstdio>
 #include <vector>
 #include <iostream>
 #include <algorithm>
 using namespace std;

//comparing function only sorts if string size is equal and keeps the larger integgers at last.
bool myfunction (string i,string j) 
{ 
int n=i.length();
int m=j.length();
if(n==m)
    return (i<j);

return n<m;   
  }


int main() {
int n;
cin>>n;
vector <string> arr(n);
for(int i=0;i<n;i++)
    cin>>arr[i];


sort(arr.begin(),arr.end(),myfunction);

for(int i=0;i<n;i++)
    cout<<arr[i]<<endl;

return 0;
 }
0
Ashish Kapil

std::setを使用できます。これは、自然にソートされたコンテナです。

0
Joe

文字列のソート:

_using namespace std; // to avoid using std everywhere 
std::sort(data.begin(), data.end()); // this will sort the strings
_

ベクターがソートされているかどうかを確認する:

_if(vec.empty())
    return true; // empty vector is sorted correctly
for(std::vector< std::string>::iterator i=vec.begin(), j=i+1; j != vec.end(); ++i, ++j)
    if(*i > *j)  return false;
return true; // sort verified
_

C++ 11ソートされたベクトルをチェックする方法:std::is_sorted(vec.begin(),vec.end())

今ソートされたベクトルを印刷:

_   for(std::vector< std::string>::iterator i = vec.begin(); i != vec.end(); ++i)
{
    std::cout<< *i <<std::endl;
}
_
0
abe312