不是c ++中的迭代器是一种指针吗?

时间:2010-04-18 03:49:13

标签: c++ list pointers iterator

好的这次我决定使用STL制作一份清单。我需要为每个客户端创建一个专用的TCP套接字。所以每次我有连接时,我都会实例化一个套接字并在列表中添加一个指针。

list<MyTcp*> SocketList;  //This is the list of pointers to sockets
list<MyTcp*>::iterator it;  //An iterator to the list of pointers to TCP sockets.

将一个新指针放到套接字上很容易,但是现在每次连接结束时我应该断开套接字并删除指针,这样我就不会有大量的内存泄漏,对吧?好吧..我认为我做得很好:

it=SocketList.begin();
while( it != SocketList.end() ){
    if((*it)->getClientId() == id){
    pSocket = it; //    <-------------- compiler complains at this line
    SocketList.remove(pSocket);
    pSocket->Disconnect();
    delete pSocket;
    break;
    }
}

但编译器这样说:

 error: invalid cast from type ‘std::_List_iterator<MyTcp*>’ to type ‘MyTcp*’

有人可以帮助我吗?我以为我做的事情是对的,在任何给定的时间只是指向集合中的一个元素不是迭代器?我该如何解决?

4 个答案:

答案 0 :(得分:18)

试试这个:

pSocket = *it; 

迭代器的行为很像指针,但实际上它们可以是一个指针,也可以是一个完全成熟的类。在这种情况下,重要的是,当你取消引用一个时,你得到容器中存储的任何项目。由于您将MyTcp*存储在列表中,因此当您取消引用迭代器时,您将获得MyTcp*pSocket的类型为MyTcp*,因此上述分配成功。您尝试执行的任务不是取消引用迭代器 - 您试图将迭代器本身分配给pSocket

有点像以下情况:

void foo()
{
    MyTcp *array[10]; // An array full of MyTcp pointers
    MyTcp **iterator = NULL; // pointers make good iterators for arrays (but not for std::lists)
    for (iterator = array; iterator != array + 10; ++iterator)
    {
        // This fails to compile (cannot assign MyTcp** to MyTcp*:
        MyTcp *wrong = iterator;            

        // This succeeds:
        MyTcp *current = *iterator; // important to dereference the iterator
    }
} 

答案 1 :(得分:6)

迭代器是指针的泛化。关于Iterator模式的Wikipedia中有一篇很好的文章。

在STL中使用迭代器的原因是使算法与容器正交。只要该容器支持迭代器,任何容器都可以与(几乎)任何算法一起使用。

答案 2 :(得分:4)

迭代器可能由指针实现(在vector的情况下,它是)。迭代器确实有指针语义 - 你取消引用它们以获得值。

但是你要在列表中存储指针。 “MyTcp *”是您的值,因此要分配它,您可以取消引用“它”。

pSocket = *it;

答案 3 :(得分:3)

迭代器只指向其中一个元素,并且取消引用它的语法是相同的,但它是一个不同的类型(具有不同的内存中表示),并且它上面的指针算法做的事情与它不同在一个指针上(即迭代器算术的结果指向一个不同的内存位置,如果你将迭代器转换为一个指针并做指针算术),所以你通常不想混淆这两种类型。

但是,鉴于您的列表是指针列表的类型,并且您只在pSocket调用中解除引用pSocket->Disconnect();一次,我认为Eclipse的答案就是您想要的:{{1 }}