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]。
很容易出错。