vector被我們翻譯為向量,雖然總覺得挺别扭,隻喜歡記它原始的名字-vector。
我一般把它當作隊列使用。
它隻能向尾部添加對象
vector<object> v;
v.push_back(aobj);//向v中添加一個object類型的aobj對象。
例如:定義求一個string類型的vector的長度
vector<string> str{10,"s3"};
for(auto c : str)//c++11
cout<<c<<endl;
cout<<"size:"<<str.size()<<endl;
c++11中支援自識别的類型auto,如上面代碼中的auto c :str,就是取所有str中的元素。
我認為它的實作方式是定義一個指針指向 &str 。然後再在調用時取*。
為了證明這個想法嘗試了如下代碼,目的是把每組輸入字元串的小寫字母換成大寫的。
string word;
vector<string> str;
while(cin>>word)
{
for(auto &c : word)
c = toupper(c);
str.push_back(word);
for(auto substr : str)
cout<<substr<<endl;
}
運作結果為:
因為vector類型是string,substr即為char*。auto會自動尋址到每個char,即&str++。若将程式改成下面的樣子
string word;
vector<string> str;
while(cin>>word)
{
for(auto &c : word)
c = toupper(c);
str.push_back(word);
for(auto substr : str)
for(auto substr1 : substr)
cout<<substr1<<endl;
}
輸入2dFe,得到的結果是每行輸出一個字母
可見substr1類型為char。
若再加一層,更改代碼為:
string word;
vector<string> str;
while(cin>>word)
{
for(auto &c : word)
c = toupper(c);
str.push_back(word);
for(auto substr : str)
for(auto substr1 : substr)
for(auto substr2 : substr1)
cout<<substr2<<endl;
}
即會報錯
19 24 C:\Users\ztana\Documents\NT\main.cpp [Error] no matching function for call to 'begin(char&)'
即substr2為char&。
這樣auto可以很友善的在循環中使用,不過類似變量定義就不要用了,比如你定義個疊代器,
vector<int> v;
auto b = v.begin();
倒是不報錯,但估計沒多久就忘了。
回到vector,vector還可以通過數組下标的方式通路,但一定要先初始化,否則會報錯。初始化之後通路沒有初始化的下标也可以通路,會傳回一個沒意義的值。
比如push_back了4次,然後通路v[4]。
很容易出錯。