C++ std list 是可以做到像linux 内核的list一样o(1)复杂度把元素从链表里面删掉的(std iterator的用法)

June 14, 2012 | 0 Minute Read

之前不知道iterator 还可以这样使用啊,搞到我想自己写了类似Linux内核的一个list的实现。

可以把 list<Request*>::iterator   其实就是链表节点来的,整个list的其他元素的添加删除不会影响到你这个iterator 的。所以插入元素到list容器的时候,顺便把:iterator  这个也保存到元素自己一个子变量。然后需要删除的时候,根据iterator来删除就可以了。

vector那些的iterator 类似普通的数组指针,但vector会自动重新分配内存,所以插入元素字号后,以前的iterator 可能无效了,但list应该没有这个问题。 这个 stl 不理解底下实现细节,也不能写出好看的代码来啊。像不同的容器 的iterator  的行为就差别很大,最好写个简单代码,跟踪一下,看看到底都怎么实现的才行。


下面 的示例代码,用list来做queue使用的。
struct Request {
 list<Request*>::iterator  pos;
 int data;
};
----------
  list<Request *> queue;
  for( int i=0; i<10; i++ ) {
  Request * req = new Request();
  req->data = i;
  queue.push_back (req);
  req->pos = --queue.end();
  }

  list<Request*>::iterator  list_it =  queue.begin();
 
  while(list_it != queue.end()) {
  Request * req = *list_it;
 if (req->data  == 8 )
 { 
  queue.erase(req->pos);
  break;
 }  
 list_it ++;
  }
   
  list_it =  queue.begin(); 
  while(list_it != queue.end()) {
  Request * req = *list_it;
  cout << " " << req->data;
  list_it ++;
  }
阅读(928)| 评论(0)