例题一:
下面这个代码输出的是( )
#include <iostream>
#include <vector>
using namespace std;
int main(void)
{
vector<int>array;
array.push_back(100);
array.push_back(300);
array.push_back(300);
array.push_back(300);
array.push_back(300);
array.push_back(500);
vector<int>::iterator itor;
for(itor=array.begin();itor!=array.end();itor++)
{
if(* itor==300)
{
itor=array.erase(itor);
}
}
for(itor=array.begin();itor!=array.end();itor++)
{
cout<<*itor<<" ";
}
return 0;
}
例题二
std::vector::iterator 没有重载下面哪个运算符( )
A.==
B.++
C.*
D.>>
例题三
T是一个数据类型,在vs系列编译器中,debug模式下,关于std::vector::at 和 std::vector::operator[] 描述正确的是( )
A.at总是做边界检查, operator[] 不做边界检查.
B.at 不做边界检查, operator[] 做边界检查.
C.at和operator[] 都是会做边界检查的
D.以上都不对
例题四
下面程序的输出结果是
int main()
{
int ar[] = {1,2,3,4,5,6,7,8,9,10};
int n = sizeof(ar) / sizeof(int);
vector<int> v(ar, ar+n); //开了多大?
cout<<v.size()<<":"<<v.capacity()<<endl;
v.reserve(100);
v.resize(20);
cout<<v.size()<<":"<<v.capacity()<<endl;
v.reserve(50);
v.resize(5);
cout<<v.size()<<":"<<v.capacity()<<endl;
}
1.
分析:程序首先把100 300 300 300 300 500进行尾插
for(itor=array.begin();itor!=array.end();itor++)
{
if(* itor==300) //向量的数据为300时进行删除
{
//删除之后迭代器进行返回赋值,不会导致迭代器失效,删除当前数据,
//后面的数据相当于会向前移动,此时itor还是指向下一个300数据,
//但是由于循环回去,for循环末尾itor++会让迭代器指向下一个
//数据,因此会错失一次300的比较判断
itor=array.erase(itor);
}
}
所以答案为: 100 300 300 500 C答案
2.
分析:vector底层是以当前类型的指针作为迭代器,对于指针而言,能够进行操作的方法都支持,如==,++,*,而>>运算符并没有重载
故答案为D
3.
注意题目专门强调了vs系列编译器,debug模式下
at() 和 operator[] 都是根据下标获取任意位置元素的,在debug模式下两者都会去做边界检查。
当发生越界行为时,at 是抛异常,operator[] 内部的assert会触发
故选择C
4.
分析:vector<int> v(ar, ar+n);
cout<<v.size()<<":"<<v.capacity()<<endl; //大小为数组元素个数,因此size=10 capacity=10
v.reserve(100); //预留空间100
v.resize(20); //调整元素为20个,此时元素的size会改变,由于个数小于容量,因此容量不会变小
cout<<v.size()<<":"<<v.capacity()<<endl;// 故size=20 capacity=100
v.reserve(50);//期望预留空间为50,可是现在的空间已经有100个,所以空间不会减小
v.resize(5); //元素个数调整为5,g++与vs都会缩size,而capacity g++缩,VS不缩
cout<<v.size()<<":"<<v.capacity()<<endl;// 故size=5 capacity=100
所以答案为:C