这是一个简单的程序
#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 ???????”
出了什么问题?
答案 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
。