1. 程式人生 > >實戰c++中的vector系列--creating vector of local structure、vector of structs initialization

實戰c++中的vector系列--creating vector of local structure、vector of structs initialization

之前一直沒有使用過vector<struct>,現在就寫一個簡短的程式碼:

#include <vector>
#include <iostream>
int main() {
    struct st { int a; };
    std::vector<st> v;
    v.resize(4);
    for (std::vector<st>::size_type i = 0; i < v.size(); i++) {
        v.operator[](i).a = i + 1; // v[i].a = i+1;
} for (int i = 0; i < v.size(); i++) { std::cout << v[i].a << std::endl; } }

用VS2015編譯成功,執行結果:
1
2
3
4

但是,這是C++11之後才允許的,之前編譯器並不允許你寫這樣的語法,不允許vector容器內放local structure。

更進一步,如果struct裡面有好幾個欄位呢?

#include<iostream>
#include<string>
#include<vector>
using namespace std; struct subject { string name; int marks; int credits; }; int main() { vector<subject> sub; //Push back new subject created with default constructor. sub.push_back(subject()); //Vector now has 1 element @ index 0, so modify it. sub[0].name = "english";
//Add a new element if you want another: sub.push_back(subject()); //Modify its name and marks. sub[1].name = "math"; sub[1].marks = 90; sub.push_back({ "Sport", 70, 0 }); sub.resize(8); //sub.emplace_back("Sport", 70, 0 ); for (int i = 0; i < sub.size(); i++) { std::cout << sub[i].name << std::endl; } }

但是上面的做法不好,我們應該先構造物件,後進行push_back 也許更加明智。
subject subObj;
subObj.name = s1;
sub.push_back(subObj);

這個就牽扯到一個問題,為什麼不使用emplace_back來替代push_back呢,這也是我們接下來討論 話題。