一、可預設構造的,也即具有public的default constructor,不論是使用者顯式定義還是編譯器預設的,但是使用者定義的帶引數constructor會仰制編譯器合成default constructor,實際上並非任何情況下任意一種容器要求其元素型別滿足這一條件,特別是關聯式容器,因為只有序列式容器的某些函式才可能明確地或隱含地使用元素型別的default constructor,如果你不呼叫這樣的成員函式,編譯器就不需要元素型別的預設建構函式。
二、可拷貝構造和拷貝賦值的,既具有public的copy constructor和copy assignment operator,不論是編譯器預設還是operator,如果沒有顯式定義它的話,這個條件可歸結為:元素必須是拷貝的,但實際上拷貝賦值的要求也不是強制的,原因和
default constructor
類似。
三、具有public的destructor,不論是編譯器預設的還是使用者顯式定義的。
四、對於關聯式容器,要求其元素必須是可比較的。
auto_ptr滿足上述條件嗎?至少滿足前三條,因此至少可以作為序列式容器的元素,如果為auto-ptr定義了比較運算子的話,應該還可以把它作為關聯式容器的元素。
但是auto_ptr的特點是接管和轉移擁有權,而不是像原始指標那樣可以共享實值物件,即auto_ptr在初始化時接管實值物件和擁有權,而在拷貝時會交出實值物件及其擁有權。
因此,auto_ptr物件和它的拷貝不會共享實值它的拷貝並不相同,然而根據stl容器值語義的要求,可拷貝構造意味著乙個著把乙個物件賦值給另乙個同型別物件將產生兩個相同的物件,顯然,auto_ptr不能滿足這一要求,與上面結論矛盾!那麼問題出在**呢?
在揭開auto_ptr
的之前需要了解
copy constructor
和copy assignment operator
,的幾種合法形式,任何乙個類都允許兩種形式的
copy constructor:
c(const c?);
c(c?);
同樣,copy assignment operator允許類似的兩種形式。
c& operator=(const c ?);
c& operator=(c & copy);
實際上,由於copy assignment operator為普通的運算子過載成員函式,因此還可以定義下列形式賦值函式;
c&operator=(c copy);
如果要防止使用者把一些不合適的物件放入容器中,就要求物件的設計和是實現者使用一些語言支援但不常用的特徵,也就是說,要能夠在編譯階段就阻止這種具有潛在危險性的行為,常用的方法就是迫使其違反c++靜態型別安全規則。
STL容器元素資料滿足哪些條件
一 可預設構造的,也即具有public的default constructor,不論是使用者顯式定義還是編譯器預設的,但是使用者定義的帶引數constructor會仰制編譯器合成default constructor,實際上並非任何情況下任意一種容器要求其元素型別滿足這一條件,特別是關聯式容器,因為...
安全刪除STL容器元素
stl容器迭代過程中刪除元素技巧 序列容器的erase方法返回值是指向緊接在被刪除元素之後的元素的有效迭代器,可以根據這個返回值來安全刪除元素。vectorc for vector iterator it c.begin it c.end 關聯容器的 erase 方法沒有返回值,被刪除的迭代器失效,...
stl容器迴圈刪除元素總結
程式中有一段 是關於stl迴圈刪除的內容,大體邏輯如下 實際邏輯要複雜的多,不適合用std remove系列函式 int main int argc,char argv auto it vec vec.begin while it vec vec.end it vec return 0 儘管平常都是...