2

这是一个简单的程序

#include <iostream>
#include <deque>
#include <string.h>

std :: deque <char> d;

int main ()
{
    const char * X = "abcdefg";

    d .insert (d .end (), X, X + strlen (X));

    d .erase  (d .begin (), d .begin () + 4);

    d .insert (d .end (), X, X + strlen (X));

    std :: cout .write (& d [0], d .size ());
}

我预计输出是“efgabcdefg”,实际输出(十六进制)是

65 66 67 00  00 00 00 C9  0B 02

哪个是“efg???????”

出了什么问题?

4

3 回答 3

6

std::deque不会将其元素连续存储在内存中。如果需要,请使用std::vector. 换句话说,&d[0]不是d.size()可以传递给的长度缓冲区的开始write()

于 2013-05-08T13:48:47.307 回答
2

您的输出的问题在于deque不能保证其元素是连续存储的,实际上几乎可以肯定不会。这意味着当您获取第一个元素的地址和大小时,您可能不会访问deque.

你有多种方法来解决你的问题。

最简单的似乎是使用string而不是deque. 然后打印变得微不足道,剪切然后附加也微不足道。

您还可以使用例如 anostream_iterator来打印deque.

最后,您可以改用vector它,因为它保证连续存储其元素。

于 2013-05-08T13:52:09.107 回答
2

正如其他人指出的那样,您不能对 的结果进行指针运算&deque<>::operator[],并期望任何合理的东西。这对于 是有保证的std::vector,但这是一种特殊情况。

做你想做的事的惯用方式是:

std::copy( d.begin(), d.end(), std::ostream_iterator<char>( std::cout ) );

这将是真的,无论d.

但为什么不使用std::vector<char>. 为了便宜地复制类似char的类型,它可能比deque无论如何都要快,即使是erase在开始时也是如此。

于 2013-05-08T13:56:45.560 回答