stl::iterator初探
c++中用于数据管理的话,在不考虑高效率的前提下,容器是个不错的选择(要求高效率的话请用数组).用到了STL一般也要和iterator打交道,一开始时以为它也就是个指向容器元素的指针,实际上它是个对象,以下为测试实例:
typedef struct stNode{
int Id;
char data[10];
}Node;
typedef std::vector<Node> vnode; // Node链表
typedef std::vector<Node*> vpnode; // Node指针链表
vnode node;
vpnode pnode;
bool init_vector() // 初始化两个链表
{
for (int i = 0; i < 10; i++) // 初始化node链表
{
Node tmp_node;
memset(&tmp_node, 0, sizeof(Node));
tmp_node.Id = i+1;
sprintf_s(tmp_node.data,10,"Name%d",i+1);
node.push_back(tmp_node);
}
for (int j = 0; j < 10; j++) // 初始化pnode链表
{
Node *tmp_node1 = new Node;
tmp_node1->Id = j+11;
sprintf_s(tmp_node1->data,10,"pName%d",j+11);
pnode.push_back(tmp_node1);
}
return true;
}
Node* getNode(const int Id) // 根据Id返回对应的Node指针
{
if (Id < 0)return(NULL);
for (vnode::iterator it = node.begin(); it != node.end(); it++) // it是指向元素的指针(暂时称为指针)
{
if (Id == (*it).Id) // 看这用法,不就是指针的用法吗?
{
//return it; 错误
return &(*it); // 正确, 此处可以看出,it并不是真正的指针,它只是具有指针某些特性的一个对象
}
}
for (vpnode::iterator itp = pnode.begin(); itp != pnode.end(); itp++) // 此时itp是二级指针
{
if (Id == (*itp)->Id)
{
return (*itp);
}
}
return(NULL);
}
Node getNode2(const int Id) // 根据Id返回对应的Node实体
{
Node rtNode;
memset(&rtNode, 0x00, sizeof(Node));
if (Id < 0)
return(rtNode);
for (vnode::iterator it = node.begin(); it != node.end(); it++) // it是指向元素的指针
{
if (Id == (*it).Id)
{
rtNode = (*it); // 返回Node实体
goto exit;
}
}
for (vpnode::iterator itp = pnode.begin(); itp != pnode.end(); itp++) // 此时itp是二级指针
{
if (Id == (*itp)->Id)
{
rtNode = (*(*itp)); // 不算是指针的用法?
goto exit;
}
}
exit:
return(rtNode);
}
// 测试代码
int _tmain(int argc, _TCHAR* argv[])
{
int id[] = {5,7,9,11,19,21,23};
init_vector();
Node *vectorNode = new Node;
for (int i = 0; i < sizeof(id)/sizeof(int); i++)
{
vectorNode = getNode(id[i]);
if(vectorNode != NULL)
printf("Found %d\n",vectorNode->Id);
else
printf("Not Found %d\n",id[i]);
}
Node vecNode;
for (int i = 0; i < sizeof(id)/sizeof(int); i++)
{
vecNode = getNode2(id[i]);
if(vecNode.Id != 0)
printf("Found %d\n",vecNode.Id);
else
printf("Not Found %d\n",id[i]);
}
return 0;
}