条目三十《确保目标区间足够大》
在使用STL中的算法时,确保目标区间足够大,这个大应该怎么理解?
在我看来就是,容器,在初始化时使用reserve()强制设定容器的容量,和在目标容器比源容器size()元素个数更小时,在使用的时候,如果是直接对目标容器操作,会由于目标容器与源容器大小不匹配的问题,从而报错。
例如:
int transmogrify(int x);
vector
vector<int> results;
transform(src.begin(), src.end(), results.end(), transmogrify);//报错 报错。。。因为results.end()是目标容器的最后,后面没有元素了,所以访问出错。
int transmogrify(int x);
vector<int> src;
for(int i = 0; i < 10; ++i)
{
src.push_back(i);
}
vector<int> results;
results.reserve(10);
for(int i = 0; i < 3; ++i)
{
src.push_back(i);
}
transform(src.begin(), src.end(), results.begin()+results.size()/2, transmogrify);//报错 报错。。。因为reserve()只是把容器的容量强制设置了,而不是容器的大小,容器的大小需要在真正插入、删除元素后才会改变。
对于第一个例子的正确方法是实用插入型的迭代器。
int transmogrify(int x);
vector
vector<int> results;
transform(src.begin(), src.end(), back_inserter(results), transmogrify);
对于第二个例子正确方法是实用插入型的迭代器。
int transmogrify(int x);
vector
vector<int> results;
results.reserve(10);
transform(src.begin(), src.end(), back_inserter(results, results.begin()+results.size()/2), transmogrify);
在使用算法的时候,必须使容器的区间大小足够大。如果是想在没有区间大小,只有容量的容器中使用算法,需要使用插入型迭代器,push_inserter
,front_inserter
。
因为即使用了reserve,但只是把容器的容量强行设置了,而没有改变容器的大小,所以在使用算法时会发生没有元素操作结果,运行错误。