C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: mapの使い方教えてください


(過去ログ 40 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■20954 / inTopicNo.1)  mapの使い方教えてください
  
□投稿者/ ケンケン (1回)-(2008/06/20(Fri) 21:36:15)

分類:[C/C++] 

環境 Visual C++ 2008  Microsoft .NET Framework Version 3.5

まだC++をはじめたばかりでよくわかっていない初心者です。
<vector>を使ったソースは出来たのですが、<map>を使って書き直したいと思ってます。
ですがよく理解出来ずに悩んでます。

やりたいことは、
1:ファイルを読み込む
2:ファイルから必要なデータを取り出す
3:データを集計する
4:データを下のように出力する  
   6620f4ff   SB006  1件

読みにくいかもしれませんが、自分の書いたソースを載せておきます。
読み込むデータファイルの中身も下に載せておきます。
アドバイスをお願いします。



#include <vector>
#include <fstream>	
#include <iostream>
using namespace std;

struct Record{
	char mesh[10];															char err[6];
	int num;
 };

#define MESHKEYWORD "メッシュ"
#define ERRKEYWORD "ERROR"

int main()	
{
	ifstream fin(Data001.txt);
	if(!fin){	
		return 1;	
	}

	char str[1024];
	Record rec;
	vector<Record>	ary;

	ary.clear() ;

	do {
	   fin.getline(str,sizeof(str)); 
	  
       if(strncmp(&str[0], MESHKEYWORD,strlen(MESHKEYWORD)) == 0) {
			strncpy(rec.mesh,&str[10],8); 
			rec.mesh[8] = '\0';
		}
		if(strncmp(&str[0], ERRKEYWORD,strlen(ERRKEYWORD)) == 0) {
			strncpy(rec.err,&str[6],5);
			rec.err[5] = '\0';

			bool searchresult = false;
		
			for(int i=0; i < ary.size(); i++)
			{
				if(strcmp(ary[i].mesh,rec.mesh) == 0){
					if(strcmp(ary[i].err,rec.err) == 0){
						ary[i].num++;
						searchresult = true;
					}
				}
			}

			if(searchresult == false){
				rec.num = 1;

				ary.push_back(rec) ;
			}
		}
	}while(!fin.eof());

	for(int i=0; i < ary.size(); i++){
		cout << ary[i].mesh << '\t';
		cout << ary[i].err << '\t';
		cout << ary[i].num << "件\n";
	}	
         fin.close() ;
         ary.clear() ;

	return 0;	
}

ちなみにデータファイルの中身はこんな感じです。

Data001.txt
メッシュ[ 6620f4ff ]を読み込みます レベル:4 緯度方向:6144 経度方向:2560
ERROR:SB006 背景種別単位ヘッダのオフセットが不正です  
ERROR:KT005 データヘッダ1WのRESERVEDに設定されています
ERROR:MNR08 道路図郭ノードから隣接図郭ノードへのリンク方向が異なります
メッシュ[ 6622f4ff ]を読み込みます レベル:4 緯度方向:6144 経度方向:2816
メッシュ[ 5816f5ff ]を読み込みます レベル:5 緯度方向:5120 経度方向:2048
ERROR:KT005 データヘッダ1WのRESERVEDに設定されています
ERROR:KT009 隣接ノード対応情報.自レベル情報.RESERVEDに設定されている
ERROR:KT010 隣接ノード対応情報.下位レベル情報.下位レベルノード番号.RESERVEDに設定されている  
ERROR:KT010 隣接ノード対応情報.下位レベル情報.下位レベルノード番号.RESERVEDに設定されている  




引用返信 編集キー/
■20956 / inTopicNo.2)  Re[1]: mapの使い方教えてください
□投稿者/ 出水 (74回)-(2008/06/20(Fri) 22:35:12)
.NET Framework関係ないじゃん!!って突っ込みはさておき

/* 定義 */
typedef std::map<std::string, int> RecordMap;
RecordMap recordmap;

/* 要素の挿入 */
recordmap.insert(RecordMap::value_type(rec.mesh, rec.num));

/* 要素の検索 */
RecordMap::iterator it = recordmap.find("6622f4ff");
if (it != recordmap.end()){
/* 発見時の処理 */
}else{
/* 要素に無い時の処理 */
}

一応、mapの簡単な使い方はこんな感じです
後はやりたいことにあわせて書き換えてください
引用返信 編集キー/
■20957 / inTopicNo.3)  Re[1]: mapの使い方教えてください
□投稿者/ επιστημη (1105回)-(2008/06/20(Fri) 22:56:33)
επιστημη さんの Web サイト
2008/06/20(Fri) 23:39:35 編集(投稿者)
> 1:ファイルを読み込む
> 2:ファイルから必要なデータを取り出す
> 3:データを集計する
> 4:データを下のように出力する  
>    6620f4ff   SB006  1件

えーと、説明もコメントもないコードを読み解けと?

...とにかく機械的にmapに変換しました。

#include <map>
#include <fstream>
#include <iostream>
#include <string>
#include <utility>

using namespace std;

typedef pair<string,string> key_type;
typedef map<key_type,int> map_type;

static const string MESHKEYWORD = "メッシュ";
static const string ERRKEYWORD  = "ERROR";

int main() {
  string str;
  key_type key;
  map_type ary;

  ifstream fin("Data001.txt");
  if ( !fin ) {
    return 1;
  }
  while ( getline(fin,str) ) {
    if( str.find(MESHKEYWORD) == 0 ) {
      key.first = str.substr(10,8); 
    }
    if ( str.find(ERRKEYWORD) == 0) {
      key.second = str.substr(6,5);
      ary[key]++;
    }
  }
  fin.close() ;
  for( map_type::iterator iter = ary.begin(); iter != ary.end(); ++iter ) {
    cout << iter->first.first << '\t'
         << iter->first.second << '\t'
         << iter->second << "件"
         << endl;
  }  
  return 0;  
}

引用返信 編集キー/
■20961 / inTopicNo.4)  Re[2]: mapの使い方教えてください
□投稿者/ ケンケン (2回)-(2008/06/21(Sat) 11:28:06)
No20956 (出水 さん) に返信
> .NET Framework関係ないじゃん!!って突っ込みはさておき

あぁ、素人丸出しでお恥ずかしい限りで・・・

> /* 定義 */
> typedef std::map<std::string, int> RecordMap;
> RecordMap recordmap;
>
> /* 要素の挿入 */
> recordmap.insert(RecordMap::value_type(rec.mesh, rec.num));
>
> /* 要素の検索 */
> RecordMap::iterator it = recordmap.find("6622f4ff");
> if (it != recordmap.end()){
> /* 発見時の処理 */
> }else{
> /* 要素に無い時の処理 */
> }
>
> 一応、mapの簡単な使い方はこんな感じです
> 後はやりたいことにあわせて書き換えてください

使い方がやっとわかってきました。
ありがとうございます。
引用返信 編集キー/
■20962 / inTopicNo.5)  Re[2]: mapの使い方教えてください
□投稿者/ ケンケン (3回)-(2008/06/21(Sat) 11:31:49)
2008/06/21(Sat) 11:35:24 編集(投稿者)
2008/06/21(Sat) 11:35:19 編集(投稿者)
No20957 (επιστημη さん) に返信
> 2008/06/20(Fri) 23:39:35 編集(投稿者)
>
> えーと、説明もコメントもないコードを読み解けと?
>
> ...とにかく機械的にmapに変換しました。

説明不足で申し訳ありません。
自分がやりたかった通りの変換です。
大変助かりました。ありがとうございます。
解決済み
引用返信 編集キー/
■20963 / inTopicNo.6)  Re[1]: mapの使い方教えてください
□投稿者/ επιστημη (1106回)-(2008/06/21(Sat) 12:38:24)
επιστημη さんの Web サイト
> <vector>を使ったソースは出来たのですが、<map>を使って書き直したいと思ってます。

vectorのまんまでも、stringとpair使ってちょいちょいといぢれば
かなりコンパクトに書けますですよ。

#include <vector>
#include <fstream>
#include <iostream>
#include <string>
#include <utility>
#include <algorithm>

using namespace std;

struct record {
  pair<string,string> key;
  int                 count;
};

bool operator==(const record& x, const record& y) {
  return x.key == y.key;
}

static const string MESHKEYWORD = "メッシュ";
static const string ERRKEYWORD  = "ERROR";

int main() {
  string str;
  record rec;
  vector<record> ary;

  ifstream fin("Data001.txt");
  if ( !fin ) {
    return 1;
  }
  while ( getline(fin,str) ) {
    if( str.find(MESHKEYWORD) == 0 ) {
      rec.key.first = str.substr(10,8); 
    }
    if ( str.find(ERRKEYWORD) == 0) {
      rec.key.second = str.substr(6,5);
      vector<record>::iterator iter = find(ary.begin(),ary.end(),rec);
      if ( iter != ary.end() ) {
        iter->count++;
      } else {
        rec.count = 1;
        ary.push_back(rec);
      }
    }
  }
  fin.close() ;
  for( vector<record>::iterator iter = ary.begin(); iter != ary.end(); ++iter ) {
    cout << iter->key.first << '\t'
         << iter->key.second << '\t'
         << iter->count << "件"
         << endl;
  }  
  return 0;  
}

引用返信 編集キー/
■20990 / inTopicNo.7)  Re[2]: mapの使い方教えてください
□投稿者/ ケンケン (4回)-(2008/06/22(Sun) 23:52:57)
No20963 (επιστημη さん) に返信
> > <vector>を使ったソースは出来たのですが、<map>を使って書き直したいと思ってます。
>
> vectorのまんまでも、stringとpair使ってちょいちょいといぢれば
> かなりコンパクトに書けますですよ。
>
そうなんですよね。一度書いたあとにstringを・・・と思ったんですが、
文字列を判定のさせる部分でこんがらがってしまって(汗)

また少し賢くなりましたm(_ _)m
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -