c++ 常見問題 2

1. using聲明和using指示html

using namespace std;---using 指示ios

using std::cin;---using 聲明算法

http://blog.csdn.net/ljq32/article/details/7950629安全

using聲明、using指示及其做用域詳解函數

http://blog.csdn.net/digu/article/details/1606563spa

關於using聲明和using指示符.net

 

2. const迭代器 const_iterator線程

vector<int> data(10);指針

const迭代器: const vector<int>::iterator iter=data.begin();htm

                    相似於常量指針,所指對象不可變,但能夠改變所指對象的值

const_iterator: vector<int>::const_iterator iter=data.begin();

                    相似於指向常量的指針,所指對象能夠變換,可是對象的值不容許改變。

 

3.stl的線程安全性

<<Effective STL>> tips 12: 
1)在每次調用容器的成員函數期間都要鎖定該容器。 
2)在每一個容器返回的迭代器(例如經過調用begin或end)的生存期以內都要鎖定該容器。 
3)在每一個在容器上調用的算法執行期間鎖定該容器。(
這事實上沒有意義,由於,正如條款32所解釋的,算法沒有辦法識別出它們正在操做的容器。不過,咱們將在這裏檢驗這個選項,由於它的教育意義在於看看爲何即便是可能的它也不能工做。)

http://blog.csdn.net/zdl1016/article/details/4161427

4.文件結束符

EOF的兩點總結(主要指普通終端中的EOF)
1.EOF做爲文件結束符時的狀況:

EOF雖然是文件結束符,但並非在任何狀況下輸入Ctrl+D(Windows下Ctrl+Z)都可以實現文件結束的功能,只有在下列的條件下,才做爲文件結束符。
(1)遇到getcahr函數執行時,要輸入第一個字符時就直接輸入Ctrl+D,就能夠跳出getchar(),去執行程序的其餘部分;
(2)在前面輸入的字符爲換行符時,接着輸入Ctrl+D;
(3)在前面有字符輸入且不爲換行符時,要連着輸入兩次Ctrl+D,這時第二次輸入的Ctrl+D起到文件結束符的功能,至於第一次的Ctrl+D的做用將在下面介紹。
其實,這三種狀況均可以總結爲只有在getchar()提示新的一次輸入時,直接輸入Ctrl+D才至關於文件結束符。

http://blog.csdn.net/doupei2006/article/details/7447650

5.cin.clear()

 

 iostream是由istream(輸入流)和ostream(輸出流)派生.因此在iostream中就有了輸入和輸出的相關對象:
一、cin 表示標準輸入(standard input)的istream類對象,cin使咱們能夠從設備讀取數據。

 

二、cout 表示標準輸出(standard output)的ostream類對象。對應於標準輸出流,默認狀況下是顯示器。這是一個被緩衝的輸出,能夠被重定向。

 

三、cerr 對應標準錯誤流,用於顯示錯誤消息。默認狀況下被關聯到標準輸出流,但它不被緩衝,也就說錯誤消息能夠直接發送到顯示器,而無需等到緩衝區或者新的換行符時,才被顯示。通常狀況下不被重定向。

 

cout與cerr的區別:cout的輸出能夠重定向到一個文件中,而cerr必須輸出在顯示器上。

 1. cin.get(),它是一個讀取單個字符的方法。字符變量=cin.get(),至關於cin.get(字符變量)。

 

  char cstr;
  cstr = cin.get(); //讀取單個字符,在屏幕輸入,至關於cin.get(cstr);
  cout<<cstr<<endl; //輸出剛剛載入的單個字符

 2.cin.getline(),則是獲取一整行文本。如下是cin.getline()原形:
 getline(char *line,int size,char='/n')
 第一個是字符指針,第二個是字符長度,第三個爲結束標識符。

cin.getline(str, sizeof(str), 'X'); //以單個英文字母'X'做爲終止標識符

 

 

例六:

 

#include 
using namespace std;
 

 

int main()
{
  char str1[200];
  char str2[200];
  cin.getline(str1, sizeof(str1), 'X'); //以單個英文字母'X'做爲終止標識符
  cin.getline(str2, sizeof(str2), 'Y'); //以單個英文字母'Y'做爲終止標識符
  cout<<"第一行是:"<<str1<<endl; //輸出
  cout<<"第二行是:"<<str2<<endl;
  system("pause");
}

 

 

 

輸入:abcdXXXefghYYYigkl(回車)

 

輸出: 第一行是:abcd

 

       第二行是:XXefgh

 

如上可知,當遇到第一個結束符'X'結束輸出abcd,以後遇到第一個結束符'Y'結束輸出XXefgh。

 3.

    接下來談談cin.clear()的做用,第一次看到這東西,不少人覺得就是清空cin裏面的數據流,而實際上卻與此相差甚遠,首先看看如下代碼:

 

例七:

#include
using namespace std;

int main()
{
  int a;
  cin>>a;
  cout<<cin.rdstate()<<endl;
  if(cin.rdstate() == ios::goodbit)
  {
    cout<<"輸入數據的類型正確,無錯誤!"<<endl;
  }
  if(cin.rdstate() == ios_base::failbit)
  {
    cout<<"輸入數據類型錯誤,非致命錯誤,可清除輸入緩衝區挽回!"<<endl;
  } 
  system("pause");
}

 

    咱們定義要輸入的變量是整型,但若是輸入了英文字母或者漢字,那就會發生錯誤,cin裏有個方法能檢測這個錯誤,就是cin.rdstate()。

    當cin.rdstate()返回0(即ios::goodbit)時表示無錯誤,能夠繼續輸入或者操做,若返回2則發生非致命錯誤即ios::failbit,則不能繼續輸入或操做。而cin.clear()則能夠控制咱們此時cin裏對這個問題的一個標識。語發以下:
cin.clear(標識符);
標識符號爲:

  • goodbit 無錯誤
  • Eofbit 已到達文件尾
  • failbit 非致命的輸入/輸出錯誤,可挽回
  • badbit 致命的輸入/輸出錯誤,沒法挽回
    若在輸入輸出類裏.須要加ios::標識符號

    經過cin.clear,咱們能確認它的內部標識符,若是輸入錯誤則能從新輸入。結合真正的清空數據流方法cin.sync(),請看下例:

例八:

#include
using namespace std;

int main()
{
  int a;
  while(true)
 {
    cin>>a; 

    if(!cin) //條件可改寫爲cin.fail()
    {
      cout<<"輸入類型錯誤,請從新輸入!"<<endl;
      cin.clear(); //復位標誌,將cin中的全部標誌設置爲有效狀態

      cin.sync(); //清空流
    }
    else
    {
      cout<<a<<endl;
      break;
    }
  }
  system("pause");
}

 

    上面的cin默認值爲非0,當輸入爲非整形時,它的狀態標識符改成fail(即0),再用cin.clear()讓錯誤標識改回爲非0,能夠繼續輸入,再清空流數據繼續輸入。若是沒有了cin.clear(),則會進入死循環,其過程爲咱們輸入了英文字母,它的狀態標識便爲fail,當運行到條件判斷時,便老是回到錯誤的條件表示裏,而且再也沒有辦法輸入,由於錯誤的表示關閉了cin,因此會進入死循環。能夠分別註釋掉cin.clear()和cin.sync()進行驗證。

http://blog.sina.com.cn/s/blog_a6fb6cc90101bg1n.html

相關文章
相關標籤/搜索