根据我的阅读,std::vector
与需要连续内存字节数组的 c 函数交互时使用的适当结构。但是我想知道在某些情况下如何确定数组的大小
我写了一个小示例程序来说明我的意思。
int main(int argc, char *argv[])
{
std::vector<unsigned char>v;
unsigned char p[1024];
sprintf((char*)&p[0], "%10d", 10);
cout << "Size: " << v.size() << " Length: " << v.capacity() << endl;
v.reserve(30);
cout << "Size: " << v.size() << " Length: " << v.capacity() << endl;
memcpy(&v[0], &p[0], 20);
cout << "Size: " << v.size() << " Length: " << v.capacity() << endl;
v.reserve(50);
cout << "Size: " << v.size() << " Length: " << v.capacity() << endl;
v.reserve(0);
cout << "Size: " << v.size() << " Length: " << v.capacity() << endl;
v.resize(20);
cout << "Size: " << v.size() << " Length: " << v.capacity() << endl;
v.resize(0);
cout << "Size: " << v.size() << " Length: " << v.capacity() << endl;
return 0;
}
输出是(不足为奇):
Size: 0 Length: 0
Size: 0 Length: 30
Size: 0 Length: 30
Size: 0 Length: 50
Size: 0 Length: 50
Size: 20 Length: 50
Size: 0 Length: 50
我这样做的原因是,因为我保留了一个一定大小的缓冲区,然后通过recv()
. 由于我必须将内存作为指针传递,因此无法根据recv
返回的内容调整向量大小。现在,当接收到的字节数小于缓冲区时,我会认为我可以以某种方式调整向量的大小,所以当我将它传回时,调用者可以执行v.size()
接收返回的元素数量。
当我从上面的例子中查看数据时,当使用resize()
缓冲区的大小调整正确时,数据却不见了。那么我真的必须将内存单独复制到一个新向量中才能获得正确的大小吗?这听起来对我来说真的是不必要的开销。或者有什么方法可以告诉向量它当前应该包含多少个元素?