std :: vector insert表现不如我所料。这是一个错误吗?

时间:2013-07-31 11:33:51

标签: c++ stdvector

我一直在使用std :: vector来存储从文件读取的一些二进制数据,然后将其序列化为通过套接字发送的数据。我为端到端功能编写了unittest,但出于意料之外的原因失败了:

std::vector<char> buf;
response->data(buf);
ASSERT(1 == buf.size());

想法是传输1个字节并接收1个字节。我实际得到的是4个字节。

基本上发生的事情是在编码和解码中使用的insert事件,将向量大小调整为bufsize * 2字节或字符。我没有在任何地方的文档中看到这一点。

unsigned long sourceLen = 1;
char source[] = { '0' };

...

std::vector<char> buf;
buf.resize(sourceLen);
buf.insert(buf.begin(), source, source + sourceLen);
ASSERT(1 == buf.size());  // Fails: buf.size() == 2.

这在解码方法的接收端再次发生,并产生四个字节的缓冲区。我通过不使用insert方法而不是实现C样式循环解决了这个问题:

buf.resize(sourceLen);
for (unsigned long i = 0; i < sourceLen; ++)
{
    buf[i] = source[i];
}
ASSERT(1 == buf.size());  // Succeeds: buf.size() == 1.

那么为什么insert会以这样的方式调整向量大小,以至于你得到的数据比你开始时的数据多?哦,我确实试过这个,这解决了缓冲区大小问题,但导致没有数据被复制:

buf.resize(sourceLen);
buf.insert(buf.begin(), data, data + dataLen - 1);

ASSERT(1 == buf.size());  // Succeeds: buf.size() == 1.
ASSERT(buf[0] == source[0]);  // Fails: buf[0] == ''.

一如既往,我在提交问题后想到了。插件是否保留当前内容并插入新值?即在调用insert?

之前,向量的大小调整应该将其大小调整为零字节

更新

我在文档中错过了这个...

The vector is extended by inserting new elements before the element at the specified position, effectively increasing the container size by the number of elements inserted.

1 个答案:

答案 0 :(得分:1)

std::insert()插入新值,重新定位旧值。因此,您所描述的行为是可以预期的。您应该使用std::copy()代替。