1.头文件:
#include<vector>
2.vector不是一种数据类型,而只是一个模板。但vector<int>,vector<string>......则是数据类型
原型:
template<class T,class Allocator = std::allocator<T>>
class vector;
3.常用构造函数
原型:
default:
explicit vector (const allocator_type& alloc = allocator_type());
fill :
explicit vector (size_type n, const value_type& val = value_type(),
const allocator_type& alloc = allocator_type());
range :
template <class InputIterator>
vector (InputIterator first, InputIterator last,
const allocator_type& alloc = allocator_type());
copy :
vector (const vector& x);
eg:
vector<int> vec1;
vector<int> vec2 (5,9); // 99999
vector<int> vec3(vec2.begin(),vec2.end()); // 99999
vector<int> vec4 (vec3); //99999
int arr[] = {1,2,3,4,5};
vector<int> vec5 (arr, arr + sizeof(arr) / sizeof(int) ); // 1 2 3 4 5
4.值得初始化
*内置类型,取决于存储在vector中的元素的数据类型,(例如,int类型,这初始化为0)
*类类型,用该类的默认构造函数初始化
eg:
vector<int> vec1(10); //10的元素都为0
vector<string> vec2(10); //调用string的默认构造函数10个元素都为空串
5.vector常用方法
*empty(),size(),operator[] //类似string类型操作,事实上大部分标准库类型都一样
*push_back():
将元素添加到尾部
原型:
void push_back( const T& value );
eg:
vector<int> vec;
vec.push_back(1);
*pop_back()
删除最后一个元素
原型:
void pop_back();
*capacity()
返回容器的容量
原型:
size_type capacity() const;
*reserve:
分配空间,更改capacity但不改变size
原型:
void reserve (size_type n);
* resize:
分配空间,更改capacity也改变size
原型:
void resize (size_type n, value_type val = value_type())
eg:
int main()
{
vector<int> vec;
vec.push_back(1);
vec.push_back(2);
vec.push_back(3);
vec.push_back(4);
for(int i=0;i<vec.size();i++)
{
cout<<vec[i]<<endl;//输出1,2,3,4
}
vec.pop_back();//vec弹出最后一个,
for(int i=0;i<vec.size();i++)
{
cout<<vec[i]<<endl; //输出1,2,3
}
vec.reserve(1); //vec依然是1,2,3
cout<<vec[2]<<endl; //ok
vec.resize(1); //vec被截断,只剩下1
cout<<vec[2]<<endl; //error
return 0;
}
*=,!=,==,<,<=,>,>= //保持这些操作的惯有语义
6.两个vector容器比较:所有元素相等而且两个容器含有相同数目的元素,则两个容器相等,否则,第一个不相等元素的比较决定了两个容器的大小
7.放入容器的类型有三个限制:(实际上它们只适用于用户自定义的类类型,因为所以预定义数据类型,包括指针,都满足这些限制)
* 元素类型必须支持等于操作符
*元素类型必须支持小于操作符
*元素类型必须支持缺省值(默认构造函数)
解析:
以上三点说明,只要满足:自定义的类型重载了==,<操作符且有默认构造函数,就可以用到vector所支持的操作符,而没有必要再重载!=,>....之类的操作符。当然了,如够你只需用到==操作符,就只需重载==操作符,而没必要再重载其它操作符。
eg:
class A
{
public:
A(int){}
};
A a(3);
vector<A> vec(3);//error,无法调用A的默认构造函数
eg:
class A
{
public:
A(){}
A(int val):x(val){}
friend bool operator == (const A& one, const A& two)
{
return (one.x == two.x) ;
}
/*
*如为成员函数,需为const,否则出错
* bool operator==(const A& other)const
* {
* return x==other.x;
* }
*
*/
friend bool operator < (const A& one, const A& two)
{
return (one.x < two.x) ;
}
private:
int x;
};
int main ()
{
A a(1),b(2);
vector<A> vec1;
vector<A> vec2;
vec1.push_back(a);
vec2.push_back(b);
cout<<(vec1==vec2)<<endl; //0
cout<<(vec1<vec2)<<endl; //1
cout<<(vec1>vec2)<<endl; //0 注意:自定义的类型A并没有重载此操作符,下同
cout<<(vec1!=vec2)<<endl; //1
cout<<(vec1<=vec2)<<endl; //1
cout<<(vec1>=vec2)<<endl; //0
return 0;
}
8.迭代器(iterator)
begin(),end(),
* iterator
eg:
vector<int>::iterator
*const_iterator
eg:
vector<int>::const_iterator //只允许以只读方式访问容器底层元素
注意:const_iterator并不等于const iterator
eg:
vector<string> vec;
vector<string>::const_iterator it=vec.begin();
++it; //ok
const vector<string>::iterator it1=vec.begin();
++it1; //error it1不能改变,只能指向vec.begin()
int main()
{
int arr[4]={1,2,3};
vector<int> vec(arr,arr+3);
for(vector<int>::iterator it=vec.begin();it!=vec.end();it++)
cout<<*it<<endl;
return 0;
}
9.迭代器的算术操作(类似于指针)
*iterator+n
*iterator-n
*iterator1-iterator2
注意:iterator1+iterator2 //error
#include<vector>
2.vector不是一种数据类型,而只是一个模板。但vector<int>,vector<string>......则是数据类型
原型:
template<class T,class Allocator = std::allocator<T>>
class vector;
3.常用构造函数
原型:
default:
explicit vector (const allocator_type& alloc = allocator_type());
fill :
explicit vector (size_type n, const value_type& val = value_type(),
const allocator_type& alloc = allocator_type());
range :
template <class InputIterator>
vector (InputIterator first, InputIterator last,
const allocator_type& alloc = allocator_type());
copy :
vector (const vector& x);
eg:
vector<int> vec1;
vector<int> vec2 (5,9); // 99999
vector<int> vec3(vec2.begin(),vec2.end()); // 99999
vector<int> vec4 (vec3); //99999
int arr[] = {1,2,3,4,5};
vector<int> vec5 (arr, arr + sizeof(arr) / sizeof(int) ); // 1 2 3 4 5
4.值得初始化
*内置类型,取决于存储在vector中的元素的数据类型,(例如,int类型,这初始化为0)
*类类型,用该类的默认构造函数初始化
eg:
vector<int> vec1(10); //10的元素都为0
vector<string> vec2(10); //调用string的默认构造函数10个元素都为空串
5.vector常用方法
*empty(),size(),operator[] //类似string类型操作,事实上大部分标准库类型都一样
*push_back():
将元素添加到尾部
原型:
void push_back( const T& value );
eg:
vector<int> vec;
vec.push_back(1);
*pop_back()
删除最后一个元素
原型:
void pop_back();
*capacity()
返回容器的容量
原型:
size_type capacity() const;
*reserve:
分配空间,更改capacity但不改变size
原型:
void reserve (size_type n);
* resize:
分配空间,更改capacity也改变size
原型:
void resize (size_type n, value_type val = value_type())
eg:
int main()
{
vector<int> vec;
vec.push_back(1);
vec.push_back(2);
vec.push_back(3);
vec.push_back(4);
for(int i=0;i<vec.size();i++)
{
cout<<vec[i]<<endl;//输出1,2,3,4
}
vec.pop_back();//vec弹出最后一个,
for(int i=0;i<vec.size();i++)
{
cout<<vec[i]<<endl; //输出1,2,3
}
vec.reserve(1); //vec依然是1,2,3
cout<<vec[2]<<endl; //ok
vec.resize(1); //vec被截断,只剩下1
cout<<vec[2]<<endl; //error
return 0;
}
*=,!=,==,<,<=,>,>= //保持这些操作的惯有语义
6.两个vector容器比较:所有元素相等而且两个容器含有相同数目的元素,则两个容器相等,否则,第一个不相等元素的比较决定了两个容器的大小
7.放入容器的类型有三个限制:(实际上它们只适用于用户自定义的类类型,因为所以预定义数据类型,包括指针,都满足这些限制)
* 元素类型必须支持等于操作符
*元素类型必须支持小于操作符
*元素类型必须支持缺省值(默认构造函数)
解析:
以上三点说明,只要满足:自定义的类型重载了==,<操作符且有默认构造函数,就可以用到vector所支持的操作符,而没有必要再重载!=,>....之类的操作符。当然了,如够你只需用到==操作符,就只需重载==操作符,而没必要再重载其它操作符。
eg:
class A
{
public:
A(int){}
};
A a(3);
vector<A> vec(3);//error,无法调用A的默认构造函数
eg:
class A
{
public:
A(){}
A(int val):x(val){}
friend bool operator == (const A& one, const A& two)
{
return (one.x == two.x) ;
}
/*
*如为成员函数,需为const,否则出错
* bool operator==(const A& other)const
* {
* return x==other.x;
* }
*
*/
friend bool operator < (const A& one, const A& two)
{
return (one.x < two.x) ;
}
private:
int x;
};
int main ()
{
A a(1),b(2);
vector<A> vec1;
vector<A> vec2;
vec1.push_back(a);
vec2.push_back(b);
cout<<(vec1==vec2)<<endl; //0
cout<<(vec1<vec2)<<endl; //1
cout<<(vec1>vec2)<<endl; //0 注意:自定义的类型A并没有重载此操作符,下同
cout<<(vec1!=vec2)<<endl; //1
cout<<(vec1<=vec2)<<endl; //1
cout<<(vec1>=vec2)<<endl; //0
return 0;
}
8.迭代器(iterator)
begin(),end(),
* iterator
eg:
vector<int>::iterator
*const_iterator
eg:
vector<int>::const_iterator //只允许以只读方式访问容器底层元素
注意:const_iterator并不等于const iterator
eg:
vector<string> vec;
vector<string>::const_iterator it=vec.begin();
++it; //ok
const vector<string>::iterator it1=vec.begin();
++it1; //error it1不能改变,只能指向vec.begin()
int main()
{
int arr[4]={1,2,3};
vector<int> vec(arr,arr+3);
for(vector<int>::iterator it=vec.begin();it!=vec.end();it++)
cout<<*it<<endl;
return 0;
}
9.迭代器的算术操作(类似于指针)
*iterator+n
*iterator-n
*iterator1-iterator2
注意:iterator1+iterator2 //error