빈에서 프로그래밍 채우기 : C ++ 프로그래밍 044 연습 학생 정보를 데이터베이스 내

북한 프로그래밍과 알고리즘 (C) 퀴즈 요약 (2020 년 봄)


기술

빈 절차 채우기, 등 그 다음의 프로그램, 첫 번째 출력

(80 권) (70 권) (JONE 90) (단자 (70)) (앨리스 100)

(78 권) (78 권) (JONE 90) (단자 (70)) (앨리스 100)

(70, 잭) (70 톰), (80, 톰) (90 존), (100, 앨리스)

(70, 오류), (70, 오류), (80, 톰), (90, JONE), (100, 앨리스)


필요에 따라 그 후, 출력 데이터는 입력 데이터로부터 생성되고

#include <iostream>
#include <string>
#include <map>
#include <iterator>
#include <algorithm>
using namespace std;
// 在此处补充你的代码
struct Student 
{
	string name;
	int score;
};
template <class T>
void Print(T first,T last) {
	for(;first!= last; ++ first)
		cout << * first << ",";
	cout << endl;
}
int main()
{
	
	Student s[] = { {"Tom",80},{"Jack",70},
					{"Jone",90},{"Tom",70},{"Alice",100} };
	
	MyMultimap<string,int> mp;
	for(int i = 0; i<5; ++ i)
		mp.insert(make_pair(s[i].name,s[i].score));
	Print(mp.begin(),mp.end()); //按姓名从大到小输出

	mp.Set("Tom",78); //把所有名为"Tom"的学生的成绩都设置为78
	Print(mp.begin(),mp.end());
	
	
	
	MyMultimap<int,string,less<int> > mp2;
	for(int i = 0; i<5; ++ i) 
		mp2.insert(make_pair(s[i].score,s[i].name));
	
	Print(mp2.begin(),mp2.end()); //按成绩从小到大输出
	mp2.Set(70,"Error");          //把所有成绩为70的学生,名字都改为"Error"
	Print(mp2.begin(),mp2.end());
	cout << "******" << endl;
	
	mp.clear();
	
	string name;
	string cmd;
	int score;		
	while(cin >> cmd ) {
		if( cmd == "A") {
			cin >> name >> score;
			if(mp.find(name) != mp.end() ) {
				cout << "erroe" << endl;
			}
			mp.insert(make_pair(name,score));
		}
		else if(cmd == "Q") {
			cin >> name;
			MyMultimap<string,int>::iterator p = mp.find(name);
			if( p!= mp.end()) {
				cout << p->second << endl;
			}
			else {
				cout << "Not Found" << endl; 
			}		
		}
	}
	return 0;
}

입력
각 라인, 다음 형식 중 하나의 입력 데이터를 :

이름 점수
Q 이름 점수

이름이없는 공백이있는 문자열이며, 이하의 (20)의 길이는
스코어가 정수 표현 될 수 INT

이름 점수는 점수의 점수가 학생의 이름에 대한 데이터베이스에 새 이름을 나타냅니다. 데이터베이스의 시작 부분에서 학생이 아니다.
Q 이름은 학생 이름의 분수로 데이터베이스에 해당 쿼리 이름을 나타냅니다

데이터는 학생들이 같은 이름 아니라는 것을 확인합니다.
입력 데이터는 20 개 이하의 라인이다.

출력
각 쿼리에 대한 점수, 출력 학생. 당신이 밖으로 찾을 수없는 경우, 출력은 "찾을 수 없음"

샘플 입력
Tom1 30
40 TOM2
Q TOM3
Tom4 89
Q Tom1
Q TOM2

样例수출
(Tom 80) (Tom 70) (Jone 90) (Jack, 70), (Alice, 100),
(Tom 78) (Tom 78) (Jone 90) (Jack, 70), (Alice, 100),
(70, Jack), (70, Tom), (80, Tom), (90, Jone) (100 Alice),
(70, Error) ( 70, Error), (80, Tom), (90, Jone) (100 Alice)


찾을 수 없음
(30)
(40)

신속한

  1. 템플릿을 작성 개의 연속 ">"않도록 컴파일러로 볼 수없는 공간 구분을 최대한 활용할 수이고, ">>"연산자. VS는 그러한 문제가 없지만, 데브 C ++ 컴파일러 환경과 서버에서이 문제가있을 수 있습니다.
    이러한 벡터 <벡터>, 우리가 변경을 원 잘못 될 수있는 벡터 <벡터> 등

  2. 템플릿에 반복자를 작성할 때, 바람직 유형 이름 키워드 앞에, 또는 그것은 잘못 컴파일 할 수있다. VS는 그러한 문제가 없지만, 데브 C ++ 컴파일러 환경과 서버에서이 문제가있을 수 있습니다.


분석

  1. 다음은 과부하 클래스를 알려져 있으며, 세 개의 매개 변수를 가지고 있으며, 그 결과를 참조하고, 객체 클래스의 함수의 이름을 비교
MyMultimap<string,int> mp;
MyMultimap<int,string,less<int> > mp2;
  1. 출력 과부하
cout << * first << ",";

아래의 코드를 얻을 수 있습니다 :

template<class key,class T , class  Pred = greater<key> >
class MyMultimap:public multimap<key,T,Pred>{
public:
	void Set(key key_value, T new_value) {
		typename multimap<key, T, Pred>::iterator start_it, end_it;
		start_it = typename multimap<key, T, Pred>::lower_bound(key_value);
		end_it = typename multimap<key, T, Pred>::upper_bound(key_value);
		while (start_it != end_it){
			start_it->second = new_value;
			start_it++;
		}
	}
};
template <class T1, class T2>
ostream& operator << (ostream& out, const pair<T1,T2>& s) {
	out << "(" << s.first << "," << s.second << ")";
	return out;
}

여기에 주

template<class key,class T , class  Pred = greater<key> >

로 세 번째 매개 변수를 입력으로 정의된다 less<int>실제로 클래스, 그들은 또한, 클래스의 정의가 동의 할 필요가있다 class Pred이 직접 기본값을 사용하여 통화 시간 이후, 다음, 클래스이며, 또한 자신의 자서전을 에, 우리는이 경우에 기본적으로, 선불의 초기 값은 class Pred = greater<key>내림차순으로 기본 설정됩니다.

게시 된 222 개 원래 기사 · 원 찬양 48 ·은 20000 +를 볼

추천

출처blog.csdn.net/qq_44116998/article/details/104427471