C++ 在winsock中将向量作为数组重用的更有效方法?

C++ 在winsock中将向量作为数组重用的更有效方法?,c++,stl,vector,winsock,C++,Stl,Vector,Winsock,我目前使用向量作为c样式的数组,通过Winsock发送和接收数据 我有一个std::vector,我用它作为我的“字节数组” 问题是,我使用了两个向量,一个用于发送,一个用于接收,但我所做的似乎效率相当低 例如: std::string EndBody("\r\n.\r\n"); std::fill(m_SendBuffer.begin(),m_SendBuffer.end(),0); std::copy(EndBody.begin(),EndBody.end(),m_SendBuffer.be

我目前使用向量作为c样式的数组,通过Winsock发送和接收数据

我有一个std::vector,我用它作为我的“字节数组”

问题是,我使用了两个向量,一个用于发送,一个用于接收,但我所做的似乎效率相当低

例如:

std::string EndBody("\r\n.\r\n");
std::fill(m_SendBuffer.begin(),m_SendBuffer.end(),0);
std::copy(EndBody.begin(),EndBody.end(),m_SendBuffer.begin());
SendData();
SendData只调用send适当的次数,确保一切正常工作

无论如何。除非我在每次使用之前将向量归零,否则我会得到重叠的错误。有没有更有效的方法让我做我正在做的事情?因为在每次调用时将整个缓冲区归零似乎效率极低


谢谢。

您可以使用m_SendBuffer.clear()

否则end()方法将不知道缓冲区的实际大小


clear()不是一个非常昂贵的调用方法。除非您正在处理486或其他不应影响性能的内容,否则调用clear不意味着向量将获得新的大小0吗?如果OP将向量用作一大块内存,那么他们必须在清除后调用resize,以确保有适当的空间用于发送和接收调用

在向量上调用clear然后resize与用零填充向量大致相同,不是吗

据我所知,调用clear只需将.end()值设置为与.begin()相同,并将大小设置为零,这是即时的

它不会改变分配的内存量或内存所在的位置(任何迭代器显然都是无效的,但数据往往会延迟!)。正如您已经发现的那样,.capacity()不会改变,存储在那里的数据也不会改变。如果您总是使用.begin().end()和STL迭代器来访问该区域,这并不重要


别忘了,类的方法变量不会初始化,除非您将它们包含在初始化列表中。添加
m_SendBuffer(BUFSIZE,0)
可能会奏效。

似乎其他海报都在关注清除缓冲区的成本或缓冲区的大小。然而,对于您正在做的事情,您实际上不需要清除或归零整个缓冲区,也不需要知道它的大小。“内容重叠错误”是SendData的一个问题,您尚未发布代码。假设SendData不知道需要发送多少缓冲区,除非其中的数据以零结尾。如果这个假设是正确的,那么您所要做的就是正确地终止数据

std::copy(EndBody.begin(),EndBody.end(),m_SendBuffer.begin());
m_SendBuffer[EndBody.size()] = 0;
SendData();

发布Send()的代码。你到底想做什么?它不会改变向量的内存分配。这通常是通过交换一个临时的空向量来减少的。