[英]Is the initialization order of the vector elements guaranteed by the standard?
要從std::cin
填充std::vector<struct_name>
,我通常編寫如下代碼:
struct point{
int x, y;
};
int main()
{
std::size_t n;
std::cin>>n;
std::vector<point> vec(n);
for (auto& p:vec)
std::cin>>p.x>>p.y;
//...
}
但是今天我發現了另一種使用默認構造函數的方法:
struct point{
int x, y;
point(){
std::cin>>x>>y;
}
};
int main()
{
std::size_t n;
std::cin>>n;
std::vector<point> vec(n);
//...
}
問題:
我對符合 C++11(和更新)標准的行為感興趣
不能保證元素按其索引的順序進行初始化。 在 C++11 中,參見 [vector.cons]/3:
效果:構造具有
n
值初始化元素的vector
。
這沒有說明排序,所以什么都不能假設。 該標准的后續版本中的措辭發生了變化,但似乎沒有強加任何順序。
在您的第一個問題上,處理vector
序列容器的C++20
(但這也可以追溯到C++11
)部分不承諾在向量本身內構造元素的順序,只是將元素設置為一些具體的價值:
效果:構造一個帶有
n
默認插入元素的vector
。
該(非常簡短的)部分(a)中的順序完全沒有。
但是你的方法有一個更大的問題,特別是我不認為你真的想要 go 到cin
對於你默認構造一個點變量的每種情況。
例如,在某些情況下,您需要一個默認構造的臨時變量,如果您的程序突然停止接受用戶輸入,尤其是在沒有向用戶提示的情況下,它將被視為掛起:-)
這使您的第二個問題沒有實際意義,但是,假設您擔心初始化向量元素然后用輸入循環更改它們的效率低下,我不會。 沒有構造函數的結構(即只有幾個int
變量)不需要初始化它們(b) ,因此它們的向量可以只進行分配並停在那里。
(a)標准中保證了某些順序,例如 class 中不同成員的順序,或數組中元素的順序。 但是,向量的元素都不是這些東西。
(b)這在C++20 10.9 Iniitialisation [class.init]
中有介紹:
當沒有為 object (可能是 cv 限定的)class 類型(或其數組)指定初始化程序,或者初始化程序具有
()
形式時,9.3
被初始化為在 9 中指定。
和C++20 9.3 Initializers [dcl.init]
:
默認初始化
T
類型的 object 意味着:
- 如果
T
是(可能是 cv 限定的)class 類型,則考慮構造函數。 枚舉適用的構造函數,並通過重載決議選擇初始化器()
的最佳構造函數。 如此選擇的構造函數被調用,帶有一個空參數列表,以初始化 object。- 如果
T
是數組類型,則每個元素都是默認初始化的。- 否則,不執行初始化。
對於沒有顯式定義或繼承的構造函數的類型,這是第一個要點。 在這種情況下,它使用隱式定義的構造函數,該構造函數等效於用戶定義的沒有主體和初始化列表的構造函數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.