並べ替える必要がある文字列がたくさんあります。これを行うには、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);
}
あなたはできる
_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;
_を使用する必要があります
i
はイテレータ==コンテナ内のデータへのポインタなので、_*
_が必要ですc_str()
は_std::string
_の関数であり、変数ではありませんあなたのコードの問題はあなたの質問に関係しませんか?
あなたのためのいくつかのヒント:
std::vector
_は_[]
_演算子もオーバーライドするため、代わりにイテレータの手間を省いて配列のように使用できます(_0
_からvector.size()
に繰り返します)。std::set
_を使用すると、挿入時に自動的にソート(バイナリツリー)されるため、余分なソートを保存できます。copy(V.begin(), V.end(), ostream_iterator<std::string>(cout, "\n"));
ソート用:
_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に感謝します。
litb は、いつものように正しいです。
より一般的なポイントを指摘したかっただけです- 何でも <と比較できるものは、std :: sortでソートできます。私はこれを行うことができるように、operator <メンバー関数を構造体に忍び込ませることがあります。
コンパレータを使用してみてください:
#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;
}
std::set
を使用できます。これは、自然にソートされたコンテナです。
文字列のソート:
_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;
}
_