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

Posted liangjf

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《条目三十:确保目标区间足够大》相关的知识,希望对你有一定的参考价值。

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

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

以上是关于《条目三十:确保目标区间足够大》的主要内容,如果未能解决你的问题,请参考以下文章

第三十六节,目标检测之yolo源码解析

《条目三十一:了解各种与排序有关的选择》

如何将片段目标绑定到底部导航栏中的菜单项?

三十岁 一切刚刚开始 — 李尚龙

第三十六天 守护进程 互斥锁 进程间通讯

模拟实现strcpy - 字符串拷贝(覆盖)