みけCATのにっき(仮)
つれづれなるまゝに、日くらし、PCにむかひて、心に移りゆくよしなし事を、そこはかとなく書きつくれば、あやしうこそものぐるほしけれ。
(本当か!?)
出典

C++で重複行削除

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

C++で重複行削除

投稿記事 by みけCAT » 14年前

ツイッター診断メーカーで診断を作るために、
テキストの重複行を削除する必要があったので、C++でプログラムを組んで作ってしまいました。
標準入力から読み込み、標準出力から出力します。

CODE:

#include 
#include 
#include 
#include 

int main(void) {
	char input[1000000];
	char* kaigyou;
	std::map list;
	std::string buf;
	while(fgets(input,sizeof(input),stdin)) {
		kaigyou=strchr(input,'\n');
		if(kaigyou)*kaigyou=0;
		buf=input;
		if(list.find(buf)==list.end()) {
			list.insert(std::map::value_type(buf,0));
			puts(input);
		}
	}
	return 0;
}
指定したキーが連想配列になかった時だけ出力する、簡単なお仕事です。

アバター
a5ua
記事: 199
登録日時: 15年前

Re: C++で重複行削除

投稿記事 by a5ua » 14年前

もう少し、C++的に書いてみました。
重複分を保持しないだけなら、std::setでOKです。
また、1行読み込みには、std::getlineが使えます。

CODE:

#include 
#include 
#include 

int main()
{
	std::set cache;
	std::string line;
	while (std::getline(std::cin, line)) {
		if (cache.find(line) == cache.end()) {
			cache.insert(line);
			std::cout << line << std::endl;
		}
	}
}

アバター
GRAM
記事: 164
登録日時: 14年前

Re: C++で重複行削除

投稿記事 by GRAM » 14年前

もっというとstd::setはあとから挿入した重複した要素が無視されてpair のsecondがfalseになりますので
オーバーヘッドを削減するにはfindを実行する必要すらないですね。