c++ 学习点滴 list forEach

又经过一个周的实战, 我的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 不同.

你可能感兴趣的:(foreach)