エラーの意味が分からない

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
Cr
記事: 93
登録日時: 12年前

エラーの意味が分からない

#1

投稿記事 by Cr » 12年前

問題は
一行目がデータの数(0ならば終了)
二行目以降は社員番号 売った品の単価 売った品の数
が与えられるので1,000,000円を超えた人を入力された順に出力しなさい
ただし社員番号は重複しないものとし、社員が複数の種類の品物を売っていることもある。
というものです。
Mingwのg++でコンパイルしたらエラーが吐きだされました

コード:

#include <iostream>
#include <vector>
#include <cstdio>
#include <map>

using namespace std;
int main(){
	int n;
	vector<int> vec;
	map<int,int> date;
	typedef map<int,int> MAP;
	cin >> n;
	int a,b,c;
	while(n){

		for(int i=0;i<n;i++){
			cin >> a >> b >> c;
			MAP::iterator it = date.find(a);

			if(it != date.end()){
				date[a] += b*c;
			}else{
				vec.push_back(a);
				date.insert(a,b * c);
			}
	
		}
		
		vector<int>::iterator  vit = vec.begin();
		bool flag = false;
		for(; vit != vec.end() ; vit++){
		
			if(date[*vit]>=1000000){
				cout << *vit  <<endl;
				flag = true;
			}
		
		}
		if(!flag)
			cout << "NA" << endl;
		
		cin >> n;
		
	}
	
	return 0;
}

エラーコードは

コード:

d:/MinGW/bin/../lib/gcc/mingw32/3.4.5/../../../../include/c++/3.4.5/bits/stl_tre
e.h: In member function `void std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _
Alloc>::insert_unique(_II, _II) [with _InputIterator = int, _Key = int, _Val = s
td::pair<const int, int>, _KeyOfValue = std::_Select1st<std::pair<const int, int
> >, _Compare = std::less<int>, _Alloc = std::allocator<std::pair<const int, int
> >]':
d:/MinGW/bin/../lib/gcc/mingw32/3.4.5/../../../../include/c++/3.4.5/bits/stl_map
.h:397:   instantiated from `void std::map<_Key, _Tp, _Compare, _Alloc>::insert(
_InputIterator, _InputIterator) [with _InputIterator = int, _Key = int, _Tp = in
t, _Compare = std::less<int>, _Alloc = std::allocator<std::pair<const int, int>
>]'
1.cpp:24:   instantiated from here
d:/MinGW/bin/../lib/gcc/mingw32/3.4.5/../../../../include/c++/3.4.5/bits/stl_tre
e.h:996: error: invalid type argument of `unary *'
です。
どなたか原因が分かる方いたら教えてください。

beatle
記事: 1281
登録日時: 12年前
住所: 埼玉
連絡を取る:

Re: エラーの意味が分からない

#2

投稿記事 by beatle » 12年前

map<K,V>に挿入するときはstd::pair<K,V>型(map<K,V>::value_typeでも同様)のデータを渡さなければなりません。

コード:

date.insert(make_pair(a, b * c))
とやれば大丈夫だと思います。

C++11で導入された、emplace系のメソッドを使うと、make_pairが要らなくなり、もっと便利です。

コード:

date.emplace(a, b * c);

アバター
Cr
記事: 93
登録日時: 12年前

Re: エラーの意味が分からない

#3

投稿記事 by Cr » 12年前

beatleさんありがとうございます!
とりあえずacceptedをもらえたので解決にします。
他にもちょこちょこボロがあったみたいなので改良点にはコメントつけてあります。
どうもありがとうございました!

コード:

#include <iostream>
#include <vector>
#include <cstdio>
#include <map>

using namespace std;
int main(){
	int n;
	vector<int> vec;
	map<int,long long> date;			//下に同じ
	typedef map<int,long long> MAP;		//入力サイズの都合上型変更
	cin >> n;
	int a;
	long long b,c;			//入力サイズが大きかったので型変更
	while(n){

		for(int i=0;i<n;i++){
			cin >> a >> b >> c;
			MAP::iterator it = date.find(a);

			if(it != date.end()){
				date[a] += b*c;
			}else{
				vec.push_back(a);
				date.insert(make_pair(a,b * c));//改良
			}
	
		}
		
		vector<int>::iterator  vit = vec.begin();
		bool flag = false;
		for(; vit != vec.end() ; vit++){
		
			if(date[*vit]>=1000000){
				cout << *vit  <<endl;
				flag = true;
			}
		
		}
		if(!flag)
			cout << "NA" << endl;
		vec.clear();			//二回目以降の入力のため一端初期化
		date.clear();			//上に同じ
		cin >> n;
		
	}
	
	return 0;
}


閉鎖

“C言語何でも質問掲示板” へ戻る