您的位置:首页 > 编程语言 > C语言/C++

c++primer学习笔记(3.3)标准库vector类型

2012-02-24 19:23 405 查看
3.3标准库vector类型

#include<vector>

using std::vector;

vector不是一种数据类型,它是一种类模版。

初始化vector对象的方法:

vector<int> ivec1; //ivec保存类型为int型,默认构造函数

vector<int> ivec2(iver1); //ivec2是ivec1的一个副本,ivec2必须和ivec1是相同类型的!!

vector<int> ivec3(n,i); //ivec3含有n个i的元素

vector<int> ivec4(n); //ivec4含有初始化元素的n个副本

vector对象元素的快速增加:先初始化一个空的vector对象,然后再动态的添加元素!

几种重要的vector对象的操作:

v.empty() 如果v为空,则返回true,否则返回false.

v.size() 返回v中元素的个数

v.push_back(t) 在v的末尾增加一个值为t的元素.

v
返回v中位置为n的元素.

v1=v2 把v1的元素替换成v2中元素的副本.

v1==v2 如果v1与v2相等,则返回true.

!=,<,<=,>,>= 保持这些操作符惯有的含义

注意:v.size()返回值是size_type类型的!!同s.size一样!!

Vector<int>::size_type //just like string::size_type

一个使用push_back(t)的案例:

#include <iostream>
#include<string>
#include<vector>
using namespace std;
 int main(){
string word;
vector<string> res;
while(cin>>word){
res.push_back(word);
}
for(vector<string>::size_type index=0;index!=res.size();index++){
cout<<res[index];
}
cout<<endl;
return 0;
 }


注意:c++未定义cin>>res与cout<<res(res为一个vector<string>类型)的行为,故采用一个一个字符输出的形式

vector的下标操作

for(vector<int>::size_type index=0;index!=s.size();index++)

s[index]=0;

vector的下标操作不会添加新的元素;只有已经存在的元素才有可能被索引!!

“缓冲区溢出”错误就是对不存在的元素进行下标操作的结果!

习题3.13

#include <iostream>
#include <vector>
using namespace std;
int main()
{
  vector<int> ivec;
  int ival;
  cout<<"input numbers(ctrl+z to end):"<<endl;
  while(cin>>ival) 
  ivec.push_back(ival);  
  if(ivec.size()==0){
  	 cout<<"no elements!"<<endl;
  	 return -1;
  }   
   cout<<"sume of each pair of adjacent elements in the vector:"<<endl;
   for(vector<int>::size_type index=1;index!=ivec.size();index=index+2){
        cout<<ivec[index-1]+ivec[index]<<" ";
 	    }
    if(ivec.size()%2!=0)	    
 	    cout<<"The last element is not been summed"  
 	        <<",the value is "<<ivec[ivec.size()-1]<<endl;
 	   
   return 0;
}


改动后:

#include <iostream>
#include <vector>
using namespace std;
int main()
{
  vector<int> ivec;
  int ival;
  cout<<"input numbers(ctrl+z to end):"<<endl;
  while(cin>>ival) 
  ivec.push_back(ival);  
  if(ivec.size()==0){
  	 cout<<"no elements!"<<endl;
  	 return -1;
  }   
   cout<<"sume of each pair of adjacent elements in the vector:"<<endl;
   for(vector<int>::size_type index=0;index!=ivec.size()/2;index++){
        cout<<ivec[index]+ivec[ivec.size()-1-index]<<" ";
 	    }
    if(ivec.size()%2!=0)	    
 	    cout<<"The midddle element is not been summed"  
 	        <<",it's value is "<<ivec[ivec.size()/2]<<endl;
 	   
   return 0;
}


习题3.14

#include<iostream>
#include<vector>
#include<string>
using namespace std;
int main(){
vector<string> vec;
string val;
while(cin>>val)
vec.push_back(val);
if(vec.empty()){
      cout<<"no data!"<<endl;
  return -1;
}
for(vector<string>::size_type index=0;index!=vec.size();index++){
for(vector<string>::size_type inx=0;inx!=vec[index].size();inx++)
    vec[index][inx]=toupper(vec[index][inx]);
      cout<<vec[index]<<" ";
      if((index+1)%8==0)
      cout<<endl;
}
 return 0;
}


习题3.15

几种定义vector的方法:

Method1:vector<int> vec(10,42);

Method2: vector<int> vec(10);

for(vector<int>::size_type index;index!=vec.size();index++){

vec[index]=42;

}

Method3:vector<int> vec;

for(vector<int>::size_type index;index!=10;index++){

vec.push_back(42);

}

vector容器的begin() ,end(), rbegin(), rend()。

begin返回第一个元素的地址,end返回最后一个元素后一个的地址。

rbegin返回最后一个元素的地址,rend返回第一个元素前面的地址。

#include <iostream>
#include <vector>
using namespace std;
int main()
{
   int n;
   vector<int> v;
   cout<<"input some numbers:"<<endl;;
   while(cin>>n){
   	v.push_back(n);
   }
   cout<<"正序:"<<endl;
   for(vector<int>::iterator iter=v.begin();iter<v.end();++iter){
   	cout<<*iter<<endl;
   }
   cout<<"逆序:"<<endl;
   for(vector<int>::reverse_iterator iter=v.rbegin();iter!=v.rend();++iter){    //注意此处时++iter!!
   	cout<<*iter<<endl;
   }
   return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: