簡體   English   中英

向量元素的初始化順序是否有標准保證?

[英]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);
    //...
}

問題

  1. 向量元素的初始化順序是否由標准(0,1,2,n-1...)保證?
  2. (如果上一個問題的答案是真的)第二個變種真的有兩次有效嗎?

我對符合 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM