[解決済み】 ベクターの重複を消去してソートする最も効率的な方法は何ですか?
2022-02-07 11:50:20
質問内容
私は潜在的に多くの要素を持つC++ベクトルを取り、重複を消去し、それを並べ替える必要があります。
現在、以下のようなコードを持っていますが、うまくいきません。
vec.erase(
std::unique(vec.begin(), vec.end()),
vec.end());
std::sort(vec.begin(), vec.end());
どうしたら正しくできるのでしょうか?
さらに、重複を先に消す(上記のコードと同様)のと、ソートを先に実行するのでは、どちらが速いでしょうか? もし最初にソートを実行した場合、その後にソートされたままであることが保証されますか?
std::unique
が実行されますか?
それとも、これらすべてを行う別の(おそらくより効率的な)方法があるのでしょうか?
どのように解決するのですか?
に同意します。
R. ペイト
と
トッド・ガードナー
; a
std::set
がいいかもしれませんね。 ベクターにこだわっても、重複が多ければ、セットを作って汚れ仕事をしたほうがいいかもしれません。
3つのアプローチを比較してみましょう。
ベクトルだけで、ソート+ユニーク
sort( vec.begin(), vec.end() );
vec.erase( unique( vec.begin(), vec.end() ), vec.end() );
セットに変換する(手動)
set<int> s;
unsigned size = vec.size();
for( unsigned i = 0; i < size; ++i ) s.insert( vec[i] );
vec.assign( s.begin(), s.end() );
セットに変換する(コンストラクタを使用する)
set<int> s( vec.begin(), vec.end() );
vec.assign( s.begin(), s.end() );
以下は、重複の数が変化したときのこれらのパフォーマンスです。
概要 : 重複の数が十分多い場合。 集合に変換してベクトルに戻した方が速いんです .
そしてなぜか、セットコンストラクタを使うよりも手動でセット変換をした方が速いようです -- 少なくとも私が使ったおもちゃのランダムデータでは。
関連
-
[解決済み】構造体のベクター初期化について
-
[解決済み】C++でランダムな2倍数を生成する
-
[解決済み】IntelliSense:オブジェクトに、メンバー関数と互換性のない型修飾子がある
-
[解決済み】cc1plus:エラー:g++で認識されないコマンドラインオプション"-std=c++11"
-
[解決済み】クラスのコンストラクタへの未定義参照、.cppファイルの修正も含む
-
[解決済み】変数やフィールドがvoid宣言されている
-
[解決済み】エラー。引数リストに一致するコンストラクタのインスタンスがない
-
[解決済み] std::vectorをハードコードされた要素で初期化する最も簡単な方法は何ですか?
-
[解決済み] リスト内の重複を見つけ、それを含む別のリストを作成するにはどうすればよいですか?
-
[解決済み] STL」と「C++ Standard Library」の違いは?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】 unsigned int vs. size_t
-
[解決済み】C++のGetlineの問題(オーバーロードされた関数 "getline "のインスタンスがない
-
[解決済み】'cout'は型名ではない
-
[解決済み】C++エラー:の初期化に一致するコンストラクタがありません。
-
[解決済み】#include<iostream>は存在するのですが、「識別子 "cout "は未定義です」というエラーが出ます。なぜですか?
-
[解決済み】CMakeエラー at CMakeLists.txt:30 (project)。CMAKE_C_COMPILER が見つかりませんでした。
-
[解決済み】VC++の致命的なエラーLNK1168:書き込みのためにfilename.exeを開くことができません。
-
[解決済み】デバッグアサーションに失敗しました
-
[解決済み] 配列のベクトルを扱う正しい方法
-
[解決済み】変数やフィールドがvoid宣言されている