ホームページ >バックエンド開発 >C++ >効率的に重複を削除し、C ベクトルを並べ替えるにはどうすればよいですか?

効率的に重複を削除し、C ベクトルを並べ替えるにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-20 20:24:10243ブラウズ

How Can I Efficiently Remove Duplicates and Sort a C   Vector?

ベクターでの重複消去と並べ替えの最適化

C では、ベクターは要素を格納するための一般的なデータ構造です。ただし、重複とソート要件を含む大きなベクトルを効率的に管理することは困難な場合があります。

非効率なアプローチ

コード スニペットでは、std を使用して重複を消去し、ベクトルをソートする試みが提供されています。 :unique および std::sort:

vec.erase(
  std::unique(vec.begin(), vec.end()),
  vec.end());
std::sort(vec.begin(), vec.end());

ただし、このアプローチでは重複を削除できません

推奨アプローチ

パフォーマンスを向上させる代替アプローチがいくつかあります。

1. std::set の使用

std::set は、並べ替えられた一意の要素のセットを自動的に維持するコンテナーです。ベクトルをセットに変換すると、重複を効率的に削除できます:

std::set<int> s(vec.begin(), vec.end());

ソートされたデータは、ベクトルに転送して戻すことができます:

vec.assign(s.begin(), s.end());

2.手動による重複の削除

ベクトルを反復処理して連続する重複をチェックすることで、重複を手動で削除することもできます。

for (auto it = vec.begin(); it != vec.end(); ) {
  if (*it == *(it+1)) {
    it = vec.erase(it);
  } else {
    ++it;
  }
}

並べ替えに関する考慮事項

並べ替えられた順序を維持するには、重複を削除した後の並べ替えが必要です。ただし、順序はすべての場合で保証されるわけではありません。

ケース 1: 最初に並べ替え、その後消去

重複を消去する前にベクトルが並べ替えられる場合、std:: unique は、ソートされた順序を保持する可能性があります。

ケース 2: 最初に消去してからソート以降

ソート前に重複を削除した場合、順序が保証されない場合があります。これは、削除の順序が後続の要素のインデックスに影響を与える可能性があるためです。

パフォーマンス

これらのアプローチのパフォーマンスは、重複の数に応じて異なります。重複が多数ある場合は、重複を手動で消去するよりも、セットに変換してからベクトルに戻す方が高速になる場合があります。ただし、重複の数が少ない場合は、手動で削除した方が効率的である可能性があります。

以上が効率的に重複を削除し、C ベクトルを並べ替えるにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。