Term30:确保目标区间足够大

Term30:确保目标区间足够大,第1张

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;
}

运行结果:

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5713863.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-18

发表评论

登录后才能评论

评论列表(0条)

保存