线性容器包括vector,list,deque。++的优先级高于*应用
vector
<int>::iterator iter
= ivec
.begin();
while (iter
!= ivec
.end())
cout
<< *iter
++ << endl
;
如果使用++iter来进行输出,那么会漏掉第一个元素,打印出越界访问后的第一个元素。++a之后的结果可是左值,而a++之后的结果是右值只能出现在等号的右边。
使用下标访问元素时记录元素下标的变量最好使用vector::size_type 类型,避免类型不同导致出错。示例如下:
vector
<int> vec
{1,2,3};
for(vector
<int>::size_type counter
= 0;counter
< vec
.size();counter
++)
{
cout
<<vec
[counter
]<<endl
;
}
vector中[]和at()的区别:编译运行下面一段代码就可以明白了:
vector使用[]访问某一个元素或者对某一个元素进行赋值时不会报错,但是它是非法访问,vector的大小还是不变。const_iterator只能用来读取,而不能改变它的值,示例如下:
vector
<int> vec(10,33);
for(vector
<int>::const_iterator const_itr
= vec
.begin(); const_itr
!= vec
.end(); const_itr
++)
{
cout
<<*const_itr
<<endl
;
}
可以对vector的迭代器直接进行加减操作,it+10,it1-it2等的操作。push_back之后有可能会导致迭代器失效,所以插入之后要重新计算迭代器的值。但是下标访问仍然可以使用。不同的容器之间可以通过下面的方式进行转化,或者只取某一个容器中的部分元素。
vector
<int> vec(10,33);
list
<int> lst(vec
.begin(),vec
.end() - 5);
for(list
<int>::iterator it
= lst
.begin(); it
!= lst
.end(); ++it
)
{
cout
<<*it
<<endl
;
}
使用一对指针去初始化容器:
int myint
[] = {1,2,3,4,5};
list
<int> lst2(myint
,myint
+5);
for(list
<int>::iterator it
= lst2
.begin(); it
!= lst2
.end(); ++it
)
{
cout
<<*it
<<endl
;
}
某个类没有默认构造函数,但是他有一个带参数的构造函数,那么可以这么初始化
class MyClass{
private:
int val
;
MyClass(){};
public:
MyClass(int val
){
cout
<<"It me!\n";
}
};
int main()
{
std
::vector
<MyClass
> v(10,1);
return 0;
}
顺序容器中添加元素的操作
std
::vector
<int> v(20,0);
list
<int> lst(4,8);
v
.insert(v
.begin() +2,3);
cout
<<v
[2]<<" "<<v
.size()<<endl
;
v
.insert(v
.begin()+2,3,9);
cout
<<v
[2]<<" "<<v
[3]<<" "<<v
[4]<<" "<<v
.size()<<endl
;
v
.insert(v
.begin()+2,lst
.begin(),lst
.end());
cout
<<v
[2]<<" "<<v
[3]<<" "<<v
[4]<<" "<<v
[5]<<" "<<v
.size()<<endl
;
容器之间的比较
- 如果两个容器具有相同的长度而且所有元素都相等, 那么这两个容器就相
等;否则,它们就不相等。
- 如果两个容器的长度不相同, 但较短的容器中所有元素都等于较长容器中
对应的元素,则称较短的容器小于另一个容器。
- 如果两个容器都不是对文的初始子序列, 则它们的比较结果取决于所比较
的第一个不相等的元素。
resize()操作 访问容器内的元素; 上述四种方式,返回的都是应用,所以可以修改容器内元素的值。只有at才会检查是否越界。 注意区分begin和front,end和back,以及[]和at的区别。vrctor的8种创建方法
list
<int> i_lst
= {1,5,9};
std
::vector
<int> v(i_lst
.begin(),i_lst
.end());
std
::vector
<int> v2(v
);
std
::vector
<int> v3(10,2);
std
::vector
<int> v4
= {1,2,3};
std
::vector
<int> v5(10);
std
::vector
<int> v6
;
std
::vector
<int> v7
{1,2,3};
std
::vector
<int> v8
= v
;
emplace_back()和push_back()的区别在于,emplace_back中的参数可以是类的构造函数的参数,这样会调用构造函数直接产生一个对象放在容器中。如果使用push_backz这类的话,传入的参数只能是对象,而不能是构造函数的参数。范围删除,并不会删除e。vector和string不支持pop_front和push_front 如果有一个可以接受一个参数的构造函数,那么也可以在resize中传入第二个参数,来创建后面的元素。