天天看點

朝花夕拾-工作一年後重拾c語言基礎,與君共勉(三)-vector和auto

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;
	}
           

運作結果為:

朝花夕拾-工作一年後重拾c語言基礎,與君共勉(三)-vector和auto

因為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,得到的結果是每行輸出一個字母

朝花夕拾-工作一年後重拾c語言基礎,與君共勉(三)-vector和auto

可見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]。

很容易出錯。

繼續閱讀