c++ 学习点滴 list forEach

本文分享了使用C++实现角色集合管理的经验,包括角色的添加、删除、排序及遍历操作。通过代码实例展示了如何利用list容器进行角色排序,并提供了一个简单的删除已死角色的功能。介绍了C++中list类的使用及其与Java arraylist的相似性,以及如何通过iterator进行元素操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

又经过一个周的实战, 我的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 不同.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值