![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?8acaa2e)
現在C++でSTLを用いてプログラムを書いておりますが、uniqueの使い方で質問があります。
1, 1, 1,2 , 1
という配列が合った場合、uniqueで重複を消した場合、
1, 2, 1
となります。
sortをしてからuniqueを使えば
1,2
となりますが、sortをせずに一気に重複変数を消すアルゴリズムはありますでしょうか?
このようなアルゴリズムが必要なのは以下の通りです。
要素にa,bを持つ構造体A
struct A{
int a;
int b;
};
で、まずaの値でソートし、次にbの値が重複しているものは消すプログラムを書いております。
例えば
(a,b) = (2,2), (1,1) (3,1)
の場合
(a,b)=(1,1) (2,2)
としたいのですが、単純にuniqueを使うと連続した値しか重複判定をしないので、
(a,b)=(1,1) (2,2) (3,1)
と(3,1)が残ってしまいます。
uniqueに変わる良い方法はありますでしょうか?
説明が下手で申し訳ございませんが、もしなにか良い方法がございましたらご教示お願いいたします。
No.3ベストアンサー
- 回答日時:
uniqueを使う場合、対象の要素があらかじめソートされてあることが必須なので、
まずはbでソート→その後uniqueという手順が必要です。
Aの配列が、bがユニーク+aでソートされている、という条件さえクリアできれば良いのであれば
void ToUnique_A(std::vector<A>& v)
{
std::sort(v.begin(), v.end(),
[] (A& a, A& b){return a.b < b.b;});
std::vector<A>::iterator it;
it = std::unique(v.begin(), v.end(),
[] (A& a, A& b){return a.b == b.b;});
v.resize(std::distance(v.begin(), it));
std::sort(v.begin(), v.end(),
[] (A& a, A& b){return a.a < b.a;});
}
このようにすれば可能です。
もしくは、setを使えば下記のように実装できます。
void ToUnique_B(std::vector<A>& v)
{
std::set<int> us;
for (std::vector<A>::iterator i = v.begin(); i != v.end(); ++i)
{
std::set<int>::iterator j = us.find(i->b);
if (j == us.end())
us.insert(i->b);
else
v.erase(i--);
}
}
No.2
- 回答日時:
#include <iostream>
#include <vector>
#include <set>
using namespace std;
int main() {
const int N = 10;
int data[N] = { 1, 2 ,2, 1 ,4 ,5, 2, 3, 4, 3 };
vector<int> result; // 結果はココに。
set<int> hist;
for( int item : data) {
if ( hist.insert(item).second ) {
result.push_back(item);
}
}
for ( int item : result ) {
cout << item << ' ';
}
cout << endl;
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) Excel 文字列を結合するときに重複をなくしたい 関数・VBA 2 2022/12/12 10:40
- MySQL エラー 1068 (42000): 複数の主キーが定義されていますエラー 2 2022/11/17 04:36
- その他(Microsoft Office) Excel関数での質問です 1 2022/11/22 13:06
- Excel(エクセル) Excelで1つしかない値だけを抽出。Unique関数を使わずに 6 2023/08/18 09:14
- Excel(エクセル) Googleスプレッドシートを使って、別シートに それぞれの合計を出したい。 1 2022/04/25 14:07
- C言語・C++・C# C言語初心者 構造体 課題について 1 2023/03/10 19:30
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- Excel(エクセル) エクセル関数の変わった使い方 3 2022/05/13 17:12
- Excel(エクセル) 【Excel】指定した文字列に該当する行を重複しないようにリスト 3 2022/03/30 12:27
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
指定した文字を削除したい
-
VC++で文字列から任意の文字を...
-
メモリーリークの検出について
-
wstringの主力
-
Cの関数からC++の関数(DLL)を...
-
enumの値から定義名を文字列化...
-
atlbase.h と afxwin.hの同時定義
-
VS2019でofstreamが未定義になる
-
構文エラーが出ているのですが...
-
#include "fstream.h"
-
std::wstringのメモリリークに...
-
gccでコンパイル時のエラー
-
ヘッダーファイルがインクルー...
-
#defineの使い方について
-
【C++】ヘッダ内でstringを格納...
-
switch文のエラーについて
-
CStringとString
-
C言語の構造体についてです。
-
プログラミング言語Cとプログラ...
-
JPEGやPNGが読めるLoadImage関数
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
switch文のエラーについて
-
構文エラーが出ているのですが...
-
VC++で文字列から任意の文字を...
-
enumの値から定義名を文字列化...
-
空ENTERの判別
-
C++でShowCursorを使いたい。
-
#define中の#のエスケープ
-
なぜ、C++の標準ヘッダをインク...
-
C++で、テキストファイルを一行...
-
C言語のエラーを修正したい
-
gccでコンパイル時のエラー
-
C言語のポインターで詰まっている
-
#include "fstream.h"
-
リモートデスクトップの接続元I...
-
構造体配列のvectorへの変換と...
-
JPEGやPNGが読めるLoadImage関数
-
VS2019でofstreamが未定義になる
-
構造体に決められた文字列を入...
-
VHDLのsignedとunsignedの違いは?
-
std::wstringのメモリリークに...
おすすめ情報