又经过一个周的实战, 我的c++水平已经能够区分 :: . -> 了, 弱爆了的说
下面分享下我的list学习经验, 直接上代码. 由于c++还数量所有 toString 方法有点恶心, 欢迎指导.
/*
* CharacterColl.h
*
* Created on: 2012-8-14
* Author: jie
*/
#ifndef CHARACTERCOLL_H_
#define CHARACTERCOLL_H_
#include <list>
#include "Character.h"
class CharacterColl {
public:
/**
* 删除已死的角色
*/
void removeExpired();
/**
* 添加新角色, 添加的时候就排序
*/
void addCharacter(Character* c);
/**
*
*/
void forEach(bool (*fun)(Character*));
private:
/**
* 所有角色数组
*/
std::list<Character*> characters;
/**
* 比较两个角色的层次关系
*/
int compair(Character* c1, Character* c2);
/**
* 所有还在这个集合中的元素按照大小排序
*/
void sort();
/**
* 删除元素
*/
void onDelete(Character* expire);
};
#endif /* CHARACTERCOLL_H_ */
/*
* Character.cpp
*
* Created on: 2012-8-10
* Author: jie
*/
#include "Character.h"
#include <iostream>
#include <stdio.h>
Character::Character(int id, int value) {
this->value = value;
this->id = id;
}
Character::~Character() {
std::cout << "~delete ";
toString(&std::cout);
std::cout << "\n";
}
int Character::getName() {
return value;
}
void Character::toString(std::ostream* cout) {
char frameName[100] = { 0 };
sprintf(frameName, "{id:%d, value:%d}", id, value);
*cout << frameName;
}
/*
* CharacterColl.h
*
* Created on: 2012-8-14
* Author: jie
*/
#ifndef CHARACTERCOLL_H_
#define CHARACTERCOLL_H_
#include <list>
#include "Character.h"
class CharacterColl {
public:
/**
* 删除已死的角色
*/
void removeExpired();
/**
* 添加新角色, 添加的时候就排序
*/
void addCharacter(Character* c);
/**
*
*/
void forEach(bool (*fun)(Character*));
private:
/**
* 所有角色数组
*/
std::list<Character*> characters;
/**
* 比较两个角色的层次关系
*/
int compair(Character* c1, Character* c2);
/**
* 所有还在这个集合中的元素按照大小排序
*/
void sort();
/**
* 删除元素
*/
void onDelete(Character* expire);
};
#endif /* CHARACTERCOLL_H_ */
/*
* CharacterCollColl.cpp
*
* Created on: 2012-8-14
* Author: jie
*/
#include "CharacterColl.h"
#include <list>
#include <iostream>
#include "Character.h"
using namespace std;
/**
* 删除已死的角色
*/
void CharacterColl::removeExpired() {
}
/**
* 添加新角色, 添加的时候就排序 TODO 可以优化
*/
void CharacterColl::addCharacter(Character* c) {
list<Character*>::iterator iter = characters.begin();
while (iter != characters.end()) {
if (compair(*iter, c) > 0) {
characters.insert(iter, c);
return;
}
iter++;
}
characters.push_back(c);
}
void CharacterColl::onDelete(Character* c) {
if (c) {
delete c;
}
}
/**
*
*/
void CharacterColl::forEach(bool (*fun)(Character*)) {
list<Character*>::iterator itor = characters.begin();
while (itor != characters.end()) {
if (fun(*itor)) {
Character* c = *itor;
itor = characters.erase(itor);
onDelete(c);
} else {
itor++;
}
}
}
/**
* 比较两个角色的层次关系
*/
int CharacterColl::compair(Character* c1, Character* c2) {
return c1->value - c2->value;
}
/**
* 所有还在这个集合中的元素按照大小排序
*/
void CharacterColl::sort() {
}
#include <stdio.h>
#include <iostream>
#include "character/CharacterColl.h"
using namespace std;
int charid;
bool printChar(Character* c) {
c->toString(&cout);
std::cout << "\n";
return false;
}
/**
* 删除奇数
*/
bool removeOdd(Character* c) {
if (c->value % 2 == 1) {
return true;
}
return false;
}
void addChar(CharacterColl &colls, int i) {
colls.addCharacter(new Character(charid++, i));
}
int main(void) {
CharacterColl colls;
addChar(colls, 10);
addChar(colls, 14);
addChar(colls, 10);
addChar(colls, 13);
addChar(colls, 20);
addChar(colls, 17);
cout << "--------------------- print\n";
colls.forEach(printChar);
cout << "--------------------- remove\n";
colls.forEach(removeOdd);
colls.forEach(printChar);
return 0;
}
list 是 std 里面的集合类, 同java的 arraylist 类似, 不过他的iterator对象稍有不同. 上面的代码我实现了这样几个功能
1 插入排入
2 forEach 传递一个 function, function 的返回值可以指导CharacterColl类型是否删除子元素
有几句核心的代码
list<Character*>::iterator itor = characters.begin();
while (itor != characters.end()) {
if (fun(*itor)) {
Character* c = *itor;
itor = characters.erase(itor);
onDelete(c);
} else {
itor++;
}
}
以上注意itor = characters.erase(itor);删除对象之后指针会自增, 所以无需自己自增.
另一段
void CharacterColl::addCharacter(Character* c) {
list<Character*>::iterator iter = characters.begin();
while (iter != characters.end()) {
if (compair(*iter, c) > 0) {
characters.insert(iter, c);
return;
}
iter++;
}
characters.push_back(c);
}
insert 之后指针指向的是刚增加的元素. 这里和 earse 不同.