关于清空缓冲区,该怎么处理

关于清空缓冲区

#include<iostream>
#include<vector>
#include<stdexcept>
using namespace std;

 void keep_window_open()
{
cin.clear();
cout<<flush; //这句不知道用的对不对
cout << "Please enter a character to exit\n";
char ch;
cin >> ch;
cout <<ch <<endl;
return;
}
int main()
try{
vector<int> v;
int x;

while(cin>>x) 
{
v.push_back(x);
}
for(int i=0;i<=v.size();i++)
cout<<"v["<<i<<"]=="<<v.at(i)<<endl;

}catch(runtime_error &e){
cout<< e.what()<<endl;
}catch (exception& oor) {
  cerr << "Out of Range error: " << oor.what() << endl;
keep_window_open();
return 1;
}catch(...){
cerr<<"exception :something went wrong\n";
return 2;

}

这个程序是我写来练习的,没什么具体目的。
但是当运行keep_window_open();时,为什么会出现一下情况呢?
city@ubuntu:~/Desktop/temp$ ./hh
11
11
f
v[0]==11
v[1]==11
Out of Range error: vector::_M_range_check
Please enter a character to exit
f

我添加cout<<flush;其实是想将最后输入的字符f 给冲掉,但是实际的结果却是没有冲掉,而是赋值给了 char ch。
不知道如果想清空输入缓冲区应该用什么函数呢?而且cout<<flush不是清空缓冲区么?
求教!!!

------解决方案--------------------
C++的不太清楚了,C语言的用法是fflush(stdin),fflush(stdout),fflush(stderr),分别刷新标准输入,输出和错误
------解决方案--------------------
cout.flush();
------解决方案--------------------
首先 cout<<flush 是用来防止程序出错时 数据放在缓冲区没有输入 而进行的手动刷新缓冲区 
如果你需要刷新所有的输出 最好使用unitbuf 这个操纵 符在每次执行完写操作后都刷新流 :
cout<<unitbuf <<"a"<<"b";与cout<<"a"<<flush<<"b"<<flush;等价,
nounitbuf则可以使流恢复原样 即系统管理缓冲区刷新

其实在这一点上primer《标准IO库》这一章,讲的挺清楚的
如果 还不清楚 可以去搜一些文章来看一下 建议这篇文章《C++编程对缓冲区的理解》


------解决方案--------------------
应该是flush(cout);返回值为cout吧,不过你那种表现用重载也可以实现
实现1:
C/C++ code

template<typename Function>
ostream& operator<<(ostream& ofile,Function f){
      return f(ofile);
}