《条目三十:确保目标区间足够大》

《条目三十:确保目标区间足够大》

在使用STL中的算法时,确保目标区间足够,这个应该怎么理解?

在我看来就是,容器,在初始化时使用reserve()强制设定容器的容量,和在目标容器比源容器size()元素个数更小时,在使用的时候,如果是直接对目标容器操作,会由于目标容器与源容器大小不匹配的问题,从而报错。

例如:
int transmogrify(int x);
vector src;
for(int i = 0; i < 10; ++i)
{
src.push_back(i);
}

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 src;
for(int i = 0; i < 10; ++i)
{
src.push_back(i);
}

vector<int> results;
transform(src.begin(), src.end(), back_inserter(results), transmogrify);

对于第二个例子正确方法是实用插入型的迭代器。
int transmogrify(int x);
vector src;
for(int i = 0; i < 10; ++i)
{
src.push_back(i);
}

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,但只是把容器的容量强行设置了,而没有改变容器的大小,所以在使用算法时会发生没有元素操作结果,运行错误。

posted @ 2019-03-31 23:48  那一抹风  阅读(161)  评论(0编辑  收藏  举报