本人在用C++/VC++編程時,遇到的一些比較難以解決的問題,在經過百思得其解之後,總結了一些解決方法,希望這些經驗之談能對大家有所幫助。
1、[VC問題] 編輯框內的換行?
答:假設要在編輯框內輸出"12345\n6789"。首先要設置編輯框的Multiline屬性為TRUE,在輸出時,除了要加\n,還要有\r。也就是說,如果要12345和6789在兩行顯示,需要輸出12345\r\n6789。代碼如下:
m_strData = "12345\r\n67890"; // m_strData是和編輯框關聯的變量
UpdateData(FALSE); //更新控件
2、[C++標准程序庫的問題] list的迭代器是否可以隨機移動?
答:由於list的內部實現是雙向鏈表,鏈表就要求迭代器(指針)只能依次從前向後(或從後向前)移動,依次移動一個位置,因此list只定義了++和--操作符,而沒有定義+、-、+=和-=等操作符。所以要想list的迭代器移動一段距離,就需要自己編程實現,用一個小循環就行了,代碼如下:
#include <list>
using namespace std;
list myList;
… // myList的初始化及其他操作
list::const_iterator itList = myList.begin();
// itList向前移動len個距離
for ( int i= 0; i < len; i++ )
{
++itList;
}
… // 其他操作
3、[C++標准程序庫的問題] 在刪除操作很多的情況下,應該選擇什麼樣的容器?
答:按照標准程序庫的說明,當刪除/插入只發生在容器的尾部時,應該使用vector;當刪除/插入只發生在容器的首/尾部時,應該使用deque;當刪除/插入操作很多,而且刪除/插入不是只在容器的首尾,這時應該選擇list。
但是這裡也有一個問題,在使用list時,由於其迭代器只能一次移動一個位置,在有大量刪除的操作時,需要大量的迭代器移動操作,因此使用list的效率會很低;list的另一個缺點是,占用空間要比同等容量大小的vector要大,這是由於list的實現需要指針,每個元素就多比vector中的元素多兩個指針(雙向鏈表),因此在每個元素都很小(幾個字節),而且元素數量很大時,使用list就非常浪費空間了。
如果使用vector,那麼刪除中間元素會導致大量的元素移動操作,效率也不高,為了解決這個問題,我們可以這樣作:使用vector容器,但是不直接刪除元素,而是再申請一個臨時vector,將原來vector中未刪除的有用元素依次加入/保存到臨時vector,然後用這個臨時vector替換原來的vector,如果實現知道要刪除的元素的個數,那麼可以事先預留臨時vector的空間,再將有用元素存到臨時vector中,代碼如下:
#include <vector>
using namespace std;
vector myVec;
… // myVec的初始化以及其它操作
vector tempVec;
// 刪除myVec中的num個元素
tempVec.reserve( myVec.size() - num ); // 預留臨時vector的空間
for ( ;; )
{
將myVec中的有用元素存到tempVec中;
}
myVec.swap( tempVec ); // myVec的容量等於或稍大於myVec.size()
… // 其它操作
這只是我目前總結的幾個問題,以後遇到問題隨時解決,隨時總結。