
C++でVC++7.0を使用してプログラミングを学んでます。
ひとつハマっているのですが…、
STLのlistを利用して、重複するデータのみを一つにしたlistにしたいです。
例えば
std::list<std::string>
[1] bbb
[2] aaa
[3] bbb
[4] ccc
[5] eee
[6] ddd
[7] bbb
[8] ccc
と格納されたlistがあった場合に、
[1] bbb
[2] ccc
と2つ以上あるデータを1つのみ格納するようにしたいです。
重複するデータを省く処理なら思いつくのですが…
(.sort()で重複するデータを並べ、.unique()で重複するデータを削除する)
上記のようなことは可能でしょうか?
何か有効な案がありましたら是非ご教授下さい!
No.1ベストアンサー
- 回答日時:
1. まず,sort() して
2. adjacent_find() の結果をすべて新しいリストにpush_back()して
3. 最後にunique()をする
というのが一番自然か.
あるいは
1. まず,sort)したあと
2. binary_predをnot_equal_to<T>にしてunique()して
3. pop_front() して,
4. 最後に,普通のunique()
でもいいような気もする.
No.4
- 回答日時:
#3の訂正をします。
#include <map>
std::map<std::string, int> list;
list["bbb"]++;
list["aaa"]++;
list["ccc"]++;
list["aaa"]++;
などとして、
map<std::string, int>::iterator p;
を経由して、
for(p = list.begin(); p != list.end(); p++)
{ p->first; // これで、index になっている方の、"aaa", "bbb", がソート済みで、しかも、重複なく、順次アクセスできます
しかも、たとえば、list["aaa"] とすれば、"aaa" の数が参照できます。
の間違いだと思います。
あと、日本語等のマルチバイト文字列が入っている場合には意図した順番にソートされていない可能性があります。

No.3
- 回答日時:
正しい使い方ではないと思いますが…… vector ではなくて、map を使うというのは?
#include <map>
std::map<int, std::string> list;
list["bbb"]++;
list["aaa"]++;
list["ccc"]++;
list["aaa"]++;
などとして、
map<std::string, std::string>::iterator *p;
を経由して、
for(p = list.begin(); p != list.end(); p++)
{ p->second; // これで、index になっている方の、"aaa", "bbb", がソート済みで、しかも、重複なく、順次アクセスできます
しかも、たとえば、list["aaa"] とすれば、"aaa" の数が参照できます。
回答ありがとうございます。
mapの特性を使うのも考えました。
しかし、listからmapに格納して
またlistに戻すのは冗長なのかな?と思って考えてました。
No.2
- 回答日時:
list<string>List1, List2;
list<string>::iterator Iter1;
//
// 要素を格納の省略
//
for( Iter1 = List1.begin(); Iter1 != List1.end(); ++Iter1 ) {
// カウントで要素数を調べる
if ( count(List1.begin(), List1.end(), *Iter1 ) > 1 ) {
if (List2.empty() ) {
List2.push_back( *Iter1 );
} else {
// 抽出先のリストに 検査項目があるかを調べ
// 無かった場合登録
if ( count(List2.begin(), List2.end(), *Iter1 ) == 0 ) {
List2.push_back( *Iter1 );
}
}
}
}
for( Iter1 = List2.begin(); Iter1 != List2.end(); ++Iter1 ) {
cout << *Iter1 << " ";
}
cout << endl;
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
DLLファイルの逆コンパイラにつ...
-
プログラマー達は何故、プログ...
-
C言語の関数のextern宣言
-
卒業研究でよく分からないとこ...
-
C言語 関数、変数の宣言について
-
C言語について(初心者)
-
C言語のことです。写真(見にく...
-
Windows Formアプリからコンソ...
-
DNCL(共テ用プログラミング言語...
-
C言語について。
-
visual studio 2022でのC#プロ...
-
あってる
-
DNCL(共テ用プログラミング言語...
-
C# で 数式文字列処理を処理す...
-
gccを行ってもexeファイルが生...
-
c言語
-
C言語 列挙型(enum型)変数について
-
C++でデスクトップGUIアプリ開...
-
c言語でイベントフラグを使った...
-
必ずyou bet と表示されます
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
c言語
-
DLLファイルの逆コンパイラにつ...
-
Windows Formアプリからコンソ...
-
大量のデータを読み込んで表示...
-
C言語の関数のextern宣言
-
VisualStudioでC++クラスを追加...
-
【C言語】全角文字の配列を、全...
-
VisualStudio2022でC言語プログ...
-
C++でデスクトップGUIアプリ開...
-
gccを行ってもexeファイルが生...
-
C#でTreeViewのCheckBoxのサイ...
-
C#でログファイルにファイルパ...
-
プログラマー達は何故、プログ...
-
逆コンパイルと逆アセンブルの...
-
Notepad++の関数リスト表示の変...
-
C言語について。
-
Cのコンパイルでコメントアウト...
-
visual studio 2022でのC#プロ...
-
コンソールアプリを作成するの...
-
C言語 バッファについて。
おすすめ情報