代码示例
void test_allocator_str()
{
cout << "input string for allocator, waiting ...\n";
int n = 100;
allocator<string> alloc;
auto const p = alloc.allocate(n);
auto q = p;
string s;
while (cin >> s && q != p + n)
alloc.construct(q++, s);
for_each(p, q, [](string str){
cout << str << " ";
});
while(q != p)
alloc.destroy(--q);
alloc.deallocate(p, n);
}
结果
分析
// 当从键盘上输入一串字符并按回车之后,这些字符首先被送到输入缓存区中。
// 每当按下回车键之后,cin.get()就会检查输入缓存区中是否有字符串可读。
// cin.get()并检查是否有流输入结束标识符Ctrl+Z(win)或Ctrl+D(Linux)
// 检查方式有两种:阻塞(Windows)和非阻塞(Linux)
// 阻塞式检查:只有在回车按下时,才检查缓存区字符串
// 特点:
// 0.Ctrl+Z:为流结束信号
// 1.只有按下回车之后才有可能检测在此之前是否有Ctrl+Z按下;
// 2.如果输入缓冲区中有可读的数据则不会检测Ctrl+Z
//(因为有要读的数据,^z不会产生字符,以及^z之后的数据,都不会被存储到输入缓冲区中)。
// 非阻塞式样指的是按下 Ctrl+D 之后立即响应的方式。
// 如果在按 Ctrl+D 之前已经从键盘输入了字符,则 Ctrl+D的作用就相当于回车,
// 即把这些字符送到输入缓冲区供读取使用,此时Ctrl+D不再起流结束符的作用。
// 如果按 Ctrl+D 之前没有任何键盘输入,则 Ctrl+D 就是流结束的信号。
// Windows一般使用阻塞式检查Ctrl+Z,Linux一般使用非阻塞式检查Ctrl+D。
参考
https://blog.csdn.net/weixin_33752045/article/details/86174521