c++ 学习点滴 list forEach

又经过一个周的实战, 我的c++水平已经能够区分 :: . -> 了, 弱爆了的说 :D

下面分享下我的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 不同.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值