最近研究注意类,略微总结一下,以后继续补充:
代码自有黄金屋

http://www.kuqin.com/cpluspluslib/20071231/3265.html
//1这是一个一般用法的例子。
// priority_queue.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
#include <map>
#include <string>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
map<int, string> mapStudent;
mapStudent.insert(pair<int, string>(1,"zl"));
mapStudent.insert(map<int, string>::value_type(2,"gs"));
//注意2,因为2这个下表map中是有的了,所以再插入2这个key是不会胜利的。
//所以,输出结果:
//2 gs而不是hys
mapStudent.insert(map<int, string>::value_type(2,"hys"));
//注意3,怎么判断insert是不是胜利
pair<map<int,string>::iterator, bool> insert_pair;
insert_pair = mapStudent.insert(map<int, string>::value_type(2,"hys"));
cout << "结果胜利或者失败:" << insert_pair.second << endl;
map<int, string>::iterator it;
map<int, string>::reverse_iterator rit;
for(it = mapStudent.begin(); it != mapStudent.end(); it++)
{
cout << it->first << " " << it->second << endl;
}
cout << "---------------" << endl;
//注意1,现实反着历遍
for(rit = mapStudent.rbegin(); rit != mapStudent.rend(); rit++)
{
cout << rit->first << " "<< rit->second << endl;
}
return 0;
}
//2,略微难点的应用
2.1在类中现实排序策略。有要注意的地方,细见代码。
注:好久没触接c++了,我一下没找到“注意1”的误错,LG笑奸
// priority_queue.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
#include <map>
#include <string>
using namespace std;
class student {
private:
unsigned int ID_;
string name_;
public:
student(unsigned int id, string name):ID_(id), name_(name)
{
}
unsigned int ID() const {
return ID_;
}
string name() const {
return name_;
}
//注意1,参数的const是必须的。否则会报:
//Error 1 error C2679: binary '<' : no operator found which takes a right-hand operand of type 'const student' (or there is no acceptable conversion) c:\program files\microsoft visual studio 11.0\vc\include\xstddef 180 1 priority_queue
//注意2,因为map中要需的,所以必须在这个地方重载这个号符
bool operator < (const student &s) const {
return (ID() < s.ID());
}
friend ostream& operator<< (ostream &o, const student &s) {
o << s.ID_ << " " << s.name_;
return o;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
map<student, int> stu;
student s1(1, "zl"), s2(2,"gs");
stu.insert(pair<student,int>(s1, 59));
stu.insert(pair<student,int>(s2, 80));
map<student, int>::iterator it;
for (it = stu.begin(); it != stu.end(); it++) {
cout << it->first << " " << it->second << endl;
}
return 0;
}
2.2.1
好啦,我们来分析被LG视鄙的那个误错吧。就是下面代码的“注意1”的误错啊。
2.2.1.1在STL的现实上是这个模式:
bool operator < (const XX &t1, const XX &t2)
{
return t1 < t2;
}
2.2.1.2这里的<号符其实就是调用我在Student类中重载的<函数,调用则规我把它写出来:
t1.<(t2);
2.2.1.3嘻嘻道来哈~~
而,我在student类中的代码:
bool operator < (/*const*/ student &s) const {
return (ID() < s.ID());
}
2.2.1.4好啦,这里很重要了,总结了:
其实t2是const型类的,传给我的<重载函数,而<重载函数的参数型类是
非const
2.2在一个类中现实策略
// priority_queue.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
#include <map>
#include <string>
using namespace std;
class student {
private:
unsigned int ID_;
string name_;
public:
student(unsigned int id, string name):ID_(id), name_(name)
{
}
unsigned int ID() const {
return ID_;
}
string name() const {
return name_;
}
//注意1,参数的const是必须的。否则会报:
//Error 1 error C2679: binary '<' : no operator found which takes a right-hand operand of type 'const student' (or there is no acceptable conversion) c:\program files\microsoft visual studio 11.0\vc\include\xstddef 180 1 priority_queue
//注意2,因为map中要需的,所以必须在这个地方重载这个号符
//bool operator < (const student &s) const {
// return (ID() < s.ID());
//}
friend ostream& operator<< (ostream &o, const student &s) {
o << s.ID_ << " " << s.name_;
return o;
}
};
//注意1,在类中现实策略
class cmp {
public:
bool operator()(const student& s1, const student &s2) const {
return s1.ID() < s2.ID();
}
};
int _tmain(int argc, _TCHAR* argv[])
{
map<student, int, cmp> stu;
student s1(1, "zl"), s2(2,"gs");
stu.insert(pair<student,int>(s1, 59));
stu.insert(pair<student,int>(s2, 80));
map<student, int>::iterator it;
for (it = stu.begin(); it != stu.end(); it++) {
cout << it->first << " " << it->second << endl;
}
return 0;
}
文章结束给大家分享下程序员的一些笑话语录:
雅虎最擅长的不是开通新业务,是关闭旧业务。