STL

《Effective STL》

30《确保目标区间足够大》

Posted by Liangjf on April 9, 2019

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

在使用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_inserterfront_inserter

因为即使用了reserve,但只是把容器的容量强行设置了,而没有改变容器的大小,所以在使用算法时会发生没有元素操作结果,运行错误。