Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Isn';t是c+中的迭代器+;一种指针?_C++_List_Pointers_Iterator - Fatal编程技术网

C++ Isn';t是c+中的迭代器+;一种指针?

C++ Isn';t是c+中的迭代器+;一种指针?,c++,list,pointers,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. 列表SocketL

好的,这次我决定用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.
列表SocketList//这是指向套接字的指针列表
列表::迭代器//指向TCP套接字指针列表的迭代器。
把一个新指针放到一个套接字上很容易,但是现在每次连接结束时,我都应该断开套接字并删除指针,这样我就不会出现巨大的内存泄漏,对吗?好。。我认为通过设置以下内容,我做得还不错:

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;
    }
}
it=SocketList.begin();
while(it!=SocketList.end()){
if((*it)->getClientId()==id){
pSocket=it;//Disconnect();
删除pSocket;
打破
}
}
但编译器是这样说的:

 error: invalid cast from type ‘std::_List_iterator<MyTcp*>’ to type ‘MyTcp*’
错误:从类型“std::_List_iterator”转换为类型“MyTcp*”无效
有人能帮我吗?我认为我做得很好,迭代器在任何给定的时间都不只是指向集合中的一个元素吗?如何修复它?

试试以下方法:

pSocket = *it; 
迭代器的行为很像指针,但实际上它们可以是指针,也可以是一个完整的类。在这种情况下,重要的是,当您取消引用一个时,您将获得存储在容器中的任何项。由于您正在列表中存储
MyTcp*
s,因此当您取消引用迭代器时,您会得到一个
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
    }
} 

迭代器可以由指针实现(对于向量,它是)。迭代器确实有指针语义——您可以取消对它们的引用以获取值

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


迭代器只指向其中一个元素,对其进行解引用的语法是相同的,但它是不同的类型(具有不同的内存表示形式),并且它的指针算法与指针算法有所不同(也就是说,迭代器算术的结果指向的内存位置与将迭代器转换为指针并执行指针算术时得到的内存位置不同),因此通常不希望混淆这两种类型


然而,考虑到您的列表是指针列表的类型,并且在
pSocket->Disconnect();
调用中只对
pSocket
解引用一次,我认为Eclipse的答案就是您想要的:
pSocket=*it;

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


在STL中使用迭代器的原因是使算法与容器正交任何算法,只要该容器支持迭代器。

迭代器指向容器中的元素,因此您需要使用*运算符取消对该元素的引用。更容易将指针视为一种随机访问迭代器……一种将所有RAM视为大向量的迭代器。@Eclipse:[关于指针和迭代器]“当你引用一个,你得到的东西都被存储在容器中……”指针和它是不是一样?指针和C++迭代器之间有什么区别吗?@艾斯凯:你可以把指针看作一种迭代器——特别是“随机访问迭代器”。“在原始内存上。有关该类型迭代器的要求,请参阅。但一般来说,迭代器可以是在其
+
*
运算符中执行各种疯狂操作的完整类。请参阅boost.iterator()了解迭代器真正可以做的一些事情。下面是一个最新的示例:std::list本身是一个双链接列表。每个列表元素单独/独立地存储在堆上的某个位置,因此迭代器需要某种指向当前列表节点的指针。operator++无法执行任何简单的加法,而必须设置其own node pointer指向被指向节点的“下一个”指针所指向的值。(哦,顺便说一句,这么多的“point…”所以实际上,它不仅仅是一个指针,而是一个围绕实际指针的整个类(指针应该是唯一必要的数据,所以迭代器和指针的大小应该相同)。
pSocket = *it;