
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ランキング
-
Vba Replace関数について教えて...
-
CSSが全く分かりません、お助け...
-
CPUが16bitでも32bitOSでコンパ...
-
最初に聞かれたこと
-
c言語の問題の説明、各所ごとに
-
Cのオブジェクトファイルの逆ア...
-
C言語 関数、変数の宣言について
-
C言語について。
-
C言語でファクト関数を使わずに...
-
プログラミング 素数か素数では...
-
あってる
-
DNCL(共テ用プログラミング言語...
-
int16_t の _t は何?
-
DLLファイルの逆コンパイラにつ...
-
visual studio 2022でのC#プロ...
-
プログラミングc++を全く分か...
-
DNCL(共テ用プログラミング言語...
-
C言語 配列と関数の練習問題
-
gccを行ってもexeファイルが生...
-
C言語 列挙型(enum型)変数について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
どちのほうがすきですか?
-
リストの中のDataFrameに他のDa...
-
C# GetFilesで複数のファイルの...
-
Python - Excel で Webからデー...
-
STLのlistで重複するものだけを...
-
この曲のピアノの最後の和音が...
-
VBAでの曖昧検索
-
Pythonでのアニメーション
-
【python】辞書作成(ネスト)を...
-
JSONで文字列が長い時
-
Application.ScreenUpdating = ...
-
formで特定のinputを送信しない...
-
メモリをアドレスを直接指定し...
-
セレクトメニューで2つの項目...
-
「*:*」って何を意味するのでし...
-
シェルスクリプトで、空白(ス...
-
実行時エラー 3020の対策
-
<SELECT>タグの折り返し
-
ACCESS テキストボックスを隙...
-
16進の10進変換について
おすすめ情報