码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2019-04-01 01:03:46      阅读:149      评论:0      收藏:0      [点我收藏+]

标签:设置   就是   strong   cto   back   算法   设定   reserve   ack   

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

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

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

标签:设置   就是   strong   cto   back   算法   设定   reserve   ack   

原文地址:https://www.cnblogs.com/liangjf/p/10634080.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!