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;

}

 

 

posted @ 2010-10-22 11:55    阅读(1642)  评论(0编辑  收藏  举报