std :: deque <char>上的简单insert-erase-insert会产生奇怪的结果</char>

时间:2013-05-08 13:45:03

标签: c++ stl deque

这是一个简单的程序

#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 ???????”

出了什么问题?

3 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:2)

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

您有多种方法可以解决您的问题。

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

您还可以使用ostream_iterator来打印deque的内容。

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

答案 2 :(得分:2)

正如其他人所指出的,你不能做指针运算 &deque<>::operator[]的结果,并期待任何事情 合理。 std::vector保证这一点,但确实如此 一个特例。

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

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

无论d的类型如何,都是如此。

但为什么不使用std::vector<char>。对于便宜的复制类型 就像char一样,它可能比deque更快,即使是 开头的erase