Programación C ++ Ejercicios 044: Programación de relleno en el espacio en blanco: la información del estudiante dentro de la base de datos

la programación del Norte y algoritmos (c) Resumen cuestionario (primavera de 2020)


descripción

relleno Procedimiento en el espacio en blanco, de tal manera que el siguiente programa, la primera salida

(Volumen 80), (Volumen 70), (Jone, 90), (jack, 70), (Alice, 100),

(Volumen 78), (Volumen 78), (Jone, 90), (jack, 70), (Alice, 100),

(70, Jack), (70, Tom), (80, Tom), (90, Jon), (100, Alice),

(70, Error), (70, Error), (80, Tom), (90, Jone), (100, Alice),


Entonces, los datos de salida se genera a partir de los datos de entrada según se requiera

#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;
}

Introduzca los
datos de entrada de cada línea, uno de los siguientes formatos:

Un nombre puntuación
nombre Q puntuación

nombre es una cadena sin espacios en blanco, la longitud de menos de 20 es
int Score es un entero, puede ser expresado

Una puntuación nombre representa un nuevo nombre a la base de datos para el nombre del estudiante, cuya puntuación de puntuación. Al principio de la base de datos no es un estudiante.
Q nombre indica que el nombre de la consulta en la base de datos como una fracción del nombre del estudiante

Los datos para asegurar que los estudiantes no son el mismo nombre.
Los datos de entrada es inferior a 200.000 líneas.

Salida de
puntuación para cada consulta, los estudiantes de salida. Si no puede encontrar la salida "no encontrado"

entrada de la muestra
A Tom1 30
A 40 Tom2
Q TOM3
A TOM4 89
Q Tom1
Q Tom2

样例exportaciones
(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),


No se ha encontrado
30
40

rápido

  1. Al escribir la plantilla, dos ">" el mejor uso del espacio separados, a fin de no ser visto como el compilador es ">>" operador consecutivas. VS puede haber tal problema, pero ambiente compilador Dev C ++ y tienen este problema en el servidor.
    Tal como vector <vector> puede salir mal, queríamos cambiar vector <vector>

  2. Al escribir iterador en la plantilla, preferentemente precedida por nombre de tipo de palabras clave, o puede ser compilado mal. VS puede haber tal problema, pero ambiente compilador Dev C ++ y tienen este problema en el servidor.


análisis

  1. Los siguientes son conocidas clase de sobrecarga, y tiene tres parámetros, se refiere a los resultados, y comparar el nombre de la función de clase de objeto
MyMultimap<string,int> mp;
MyMultimap<int,string,less<int> > mp2;
  1. sobrecarga de salida
cout << * first << ",";

Es posible conseguir el código de abajo:

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;
}

Nota aquí

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

El tercer parámetro se define como el entrante como less<int>es en realidad una clase, sino que también hay que aceptar es la definición de la clase, que class Predse trata de una clase, entonces, desde la época de la llamada directamente utilizando el valor por defecto, también tienen su propia biografía en, entonces por defecto para este caso, el valor inicial de un prepago class Pred = greater<key>por defecto como en orden descendente.

Publicados 222 artículos originales · ganado elogios 48 · Vistas a 20000 +

Supongo que te gusta

Origin blog.csdn.net/qq_44116998/article/details/104427471
Recomendado
Clasificación