c++ - C++ 中的 Iterator 不是一种指针吗?

标签 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*’

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

最佳答案

试试这个:

pSocket = *it; 

迭代器的行为很像指针,但实际上它们可以是指针或行为类似的完整类。在这种情况下重要的是,当您取消引用一个时,您将获得存储在容器中的任何项目。由于您将 MyTcp* 存储在列表中,因此当您取消引用迭代器时,您会得到一个 MyTcp*pSocketMyTcp* 类型,所以上面的赋值成功。您尝试执行的分配不是取消对迭代器的引用——您正在尝试将迭代器本身分配给 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
    }
} 

关于c++ - C++ 中的 Iterator 不是一种指针吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2661053/

相关文章:

c++ - 如何评估 noexcept() 运算符的结果

c++ - 从派生类到基类成员变量类型的自动转换

c++ - 在不复制的情况下从 Eigen::SparseMatrix 中提取 block /ROI

c# - 寻找LINQ语法,以获取以特定内容开头的列表中的第二项

c++ - 指向类模板成员的函数指针

c++ - 给定一个字符串数组,返回所有是变位词的字符串组

c# - 在 C# 中,如何在给定 List<Object> 时确定对象的类型?

javascript - 购物车删除列表并更新总价

c - C 中的内存分配器——如何利用 sbrk() 的空间

c - 结构体和指针