栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

Term30:确保目标区间足够大

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Term30:确保目标区间足够大

        本条款需要我们牢记的是:无论何时,如果所使用的算法(来自这个标准头文件)需要指定一个目标区间,那么必须确保目标区间足够大(用.reserve() or .resize()来do),或者确保它会随着算法的运行而增大,要在算法执行过程中增大目标区间,请使用插入型迭代器,比如back_iterator,front_iterator和inserter返回的迭代器。这些都是你需要记住的。

test codes1:(向容器vector中添加新的对象)

#include
#include
#include
using namespace std;
int transFunc(int x) {
	return x * x;
}
int main(void) {
	vector values{ 1,2,3 };
	vector res;
	res.reserve(values.size() + res.size());//确保目标区间有足够的空间容纳算法结果
	transform(values.begin(), values.end(), back_inserter(res), transFunc);
    //使用transform()函数将原容器values中的begin到end区间内的每一个elems传入transFunc函数的结果
    //都(使用back_inserter)插入到res容器的尾部
    cout << "after using back_inserter insert elems to the back of res: " << endl;
	for_each(res.begin(), res.end(), [](int v) {cout << v << "t"; });
	cout << endl;
	return 0;
}

运行结果:

        解释:这里使用back_inserter函数,返回一个迭代器,该迭代器使用方法push_back()来做元素的插入工作,当然,只有支持push_back()方法的容器才能这么使用!(注意:若容器size不足了,这个push_back操作会让对应的容器进行自动扩容)

test codes2:(向容器list中添加新的对象)

#include
#include
#include
using namespace std;
int transFunc(int x) {
	return x * x;
}
int main(void) {
	list values{ 1,2,3 };
	list res;
    res.reserve(values.size() + res.size());//确保目标区间有足够的空间容纳算法结果
	transform(values.begin(), values.end(), front_inserter(res), transFunc);
	cout << "after using front_inserter insert elems to the front of res: " << endl;
	for_each(res.begin(), res.end(), [](int v) {cout << v << "t"; });
	cout << endl;
	return 0;
}

运行结果:

         解释:这里使用front_inserter函数,返回一个迭代器,该迭代器使用方法push_front()来做元素的插入工作,当然,只有支持push_front()方法的容器才能这么使用!(注意:若容器size不足了,这个push_front操作会让对应的容器进行自动扩容)

test codes3:(向容器list中添加新的对象)

#include
#include
#include
using namespace std;
int transFunc(int x) {
	return x * x;
}
int main(void) {
	list values{ 1,2,3 };
	list res;
    res.reserve(values.size() + res.size());//确保目标区间有足够的空间容纳算法结果
	transform(values.begin(), values.end(),inserter(res,res.begin()), transFunc);
	cout << "after using inserter insert elems to the front of res: " << endl;
	for_each(res.begin(), res.end(), [](int v) {cout << v << "t"; });
	cout << endl;
	return 0;
}

运行结果:

         解释:这里使用inserter函数,返回一个迭代器,该迭代器是用于把算法结果插入到容器中的特定的位置上的(比如这里就是插入到res的开始begin处)。

        小总结:

1-使用front_inserter导致算法将结果插入到容器的头部
2-使用back_inserter导致算法将结果插入到容器的尾部
3-使用inserter导致算法将结果插入到容器中的指定位置(自定义)上

        补充:如果你希望像transform这样的算法把Func的结果以新的元素之形式插入到容器中,你就必须使用到上述的3种插入迭代器之一(依据你所使用的容器而定)。

        但有时,我只是希望简简单单地覆盖某个容器中已有的元素,而不是插入新元素的话,这种case下你就不需要插入迭代器了,但你仍然需要遵守本条款:确保目标区间的空间足够容纳算法的结果。

test codes4:(覆盖某个容器中已有的元素)

#include
#include
#include
int transFunc(int x) {
	return x * x;
}
int main(void) {
	vector values{ 3,3,8 };
	vector res;
	if (res.size() < values.size())
		res.resize(values.size());//确保res至少和values一样大!
    //进而确保目标区间有足够大的空间去容纳原容器的data
	transform(values.begin(), values.end(), res.begin(), transFunc);
	cout << "after covering elems to the begin of res: " << endl;
	for_each(res.begin(), res.end(), [](int v) {cout << v << "t"; });
	cout << endl;
	return 0;
}

运行结果:

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/717542.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号