c++ Primer的问题,牛牛们给个指点。

kunlun64 2006-09-03 09:54:46
第11章 泛型算法里
11.7 判断下面程序是否有错,如果有请改正。
(b) vector<int> vec;
vec.reserve(10);
fill_n(vec.begin(),10,0);

11.8 前面说过,算法不改变它所操纵的容器大小,为什么使用back_inserter也不能突破这个限制。

想不明白,back_inserter不是相当于调用push_back吗?前面讲解里例子有:
vector<int> vec;
fill_n(back_inserter(vec),10,0);
这样不是改变了容器大小吗?
请牛牛们给指点一下。
...全文
564 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
OOPhaisky 2006-09-03
  • 打赏
  • 举报
回复
说实话,没太看懂楼主的问题,但是

vector<int> vec;
fill_n(back_inserter(vec),10,0);
这样不是改变了容器大小吗?
---------------------------------------
这样的确改变了容器的大小(size),这是没错的。


vector<int> vec;
vec.reserve(10);
fill_n(vec.begin(),10,0);
---------------------------------
这是错误的,因为reserve只是改变了capacity,没有改变size,容器中并没有‘有效’元素。
kunlun64 2006-09-03
  • 打赏
  • 举报
回复
谢谢,steedhorse(晨星)版主,对关键概念上重新获得理解。
结贴。
晨星 2006-09-03
  • 打赏
  • 举报
回复
没有问题啊,Lippman前面自己不已经给出这个问题的答案了吗?

Key Concept: Algorithms Never Execute Container Operations
The generic algorithms do not themselves execute container operations. They operate solely in terms of iterators and iterator operations. The fact that the algorithms operate in terms of iterators and not container operations has a perhaps surprising but essential implication: When used on "ordinary" iterators, algorithms never change the size of the underlying container. As we'll see, algorithms may change the values of the elements stored in the container, and they may move elements around within the container. They do not, however, ever add or remove elements directly.

As we'll see in Section 11.3.1 (p. 406), there is a special class of iterator, the inserters, that do more than traverse the sequence to which they are bound. When we assign to these iterators, they execute insert operations on the underlying container. When an algorithm operates on one of these iterators, the iterator may have the effect of adding elements to the container. The algorithm itself, however, never does so.


fill_n(back_inserter(vec),10,0);
中,问题在于,fill_n算法从来都不会改变容器的size,改变容器size的是back_inserter,back_inserter并不是一种“算法”,它可以看成是种“迭代适配器”。
于是,上面这条语句中的fill_n是一直是在“被back_inserter修改着的”容器中插入无素,它本身从来不曾修改vec容器的大小,而且也不知道容器是否被谁改过。
换句话说,它只会低着头不断往里插,却不曾知道back_inserter一直在背地里协助它,并为之承担了“修改容器大小”的骂名,呵呵。
kunlun64 2006-09-03
  • 打赏
  • 举报
回复
to OOPhaisky(渴望成功)
这样的确改变了容器的大小(size),这是没错的。
=============================================
是呀,我也认为是改变了容器大小。可大师Lippman在书上说没有。难道是翻译的问题?谁有原版给查查,11.8题是不是这个意思。

还有哪位大牛来指点一下。
jixingzhong 2006-09-03
  • 打赏
  • 举报
回复
第一个问题也是这个原因,
vec.reserve(10); 只是增加了 容量,
里面的元素空间仍是 0 ...

fill_n 需要有效元素空间...
jixingzhong 2006-09-03
  • 打赏
  • 举报
回复
我的意思就是,
你要把这个 容器的容量 和容器的元素个数 区别开来 ...

插入只是增加元素, 不能增加容量 ...
(这个好像就是你的问题了 晕 =_= 楼主你就当作一个概念记住吧,用多了就明白了)
jixingzhong 2006-09-03
  • 打赏
  • 举报
回复
vec.reserve(10);
fill_n(vec.begin(),10,0);
=============
reserve 只是设置了 capacity,
还是没有元素空间的 ...
kunlun64 2006-09-03
  • 打赏
  • 举报
回复
to jixingzhong(瞌睡虫:选择了远方,只顾风雨兼程!)
谢谢你的帮助。
可vector<int> vec定义的是空容器呀。vec.size()和vec.capacity()都等于0,这在编译里测试过的。而且容器预留分配也是根据现有大小翻倍分配的,不能简单理解为100吧。
jixingzhong 2006-09-03
  • 打赏
  • 举报
回复
11.8 前面说过,算法不改变它所操纵的容器大小,为什么使用back_inserter也不能突破这个限制。
=======
你可以这么理解,
容器一次性给出了若干个空间, 比如可以放 100 个元素,
但是你只放了 10 个有效元素,
然后 back_inserter 只是在这100个空间中插入有效元素,
并不改变这个容器空间(100)
lann64 2006-09-03
  • 打赏
  • 举报
回复
mark
kunlun64 2006-09-03
  • 打赏
  • 举报
回复
昏,越来越麻烦。
我的测试程序没写#include <algorithm>怎么也通过编译了。
kunlun64 2006-09-03
  • 打赏
  • 举报
回复
难道说Lippman大师出了错,或者gcc实现没遵守标准?
kunlun64 2006-09-03
  • 打赏
  • 举报
回复
谢谢各位。
第一个问题明白了,fill_n(vec.begin(),10,0)并不能改变vec.size().
但第二个问题还是不懂。我用编译器测试,发现容器大小的确是改变了。
#include <iostream>
#include <vector>

using namespace std;
int main()
{
vector<int> vec;
cout << "size: " << vec.size() << " capacity: " << vec.capacity() << endl;
fill_n(back_inserter(vec),10,0);
cout << "size: " << vec.size() << " capacity: " << vec.capacity() << endl;

return 0;
}
输出结果:
size: 0 capacity:0
size: 10 capacity: 16

我用的是minGW
内容概要:本文围绕三相逆变器模型仿真及软开关技术展开研究,基于Simulink平台构建了完整的系统仿真模型,深入分析了三相逆变器的拓扑结构、工作原理与动态响应特性。研究重点聚焦于软开关技术(如零电压开关ZVS、零电流开关ZCS)在逆变器中的应用,通过仿真验证其在降低开关损耗、提高转换效率、减小电磁干扰等方面的显著优势。文章详细阐述了软开关的实现条件与控制策略设计,结合LCL滤波器优化与PWM调制技术,提升了系统整体性能。通过对电压、电流波形及功率因数等关键指标的仿真分析,验证了所提出方案的有效性与可行性,为高性能逆变器的设计与优化提供了理论依据和技术支撑。; 适合人群:具备电力电子、电气工程及其自动化等相关专业背景,熟悉Simulink仿真环境,从事新能源发电、电力变换器设计、微电网控制或电能质量治理等领域研究的科研人员、工程技术人员及研究生。; 使用场景及目标:①用于高校电力电子课程教学与实验,辅助学生理解逆变器工作机理及软开关技术原理;②为工业界高效率逆变电源、光伏并网逆变器、储能变流器等产品的研发提供技术参考;③支持相关领域科研人员开展新型拓扑与先进控制算法的仿真验证与学术论文撰写。; 阅读建议:建议读者结合文中所述Simulink模型进行动手实践,重点关注软开关触发时序、谐振参数设计与系统稳定性之间的关系,同时可延伸学习死区效应补偿、锁相环控制、孤岛检测等相关技术以构建完整的逆变系统知识体系。
内容概要:本文围绕“计及电转气协同的含碳捕集与垃圾焚烧虚拟电厂优化调度”展开研究,提出了一种集成电转气(P2G)、碳捕集利用与封存(CCUS)以及垃圾焚烧发电技术的虚拟电厂协同优化调度模型。通过引入碳交易机制,构建以低碳经济为目标的综合能源系统优化框架,采用模型预测控制等先进算法实现多能互补与资源高效利用。研究提供了完整的Matlab仿真代码,涵盖系统建模、约束条件设定、目标函数构建及求解全过程,具备较高的科研参考价值与工程实践意义。; 适合人群:面向具备电力系统、能源系统或自动化等相关专业背景,熟悉Matlab编程环境,从事综合能源系统、低碳调度、虚拟电厂等领域科研工作的研究人员,尤其适用于研究生、高校教师及能源行业技术人员。; 使用场景及目标:①用于虚拟电厂、碳减排与多能协同调度等方向的学术研究与仿真验证;②支撑学位论文撰写、科技项目申报或高水平期刊投稿中的案例分析与算法对比;③掌握碳交易机制下电-气-废协同优化的技术路径与建模方法,提升复杂能源系统优化能力。; 阅读建议:建议结合碳交易政策背景与多能流耦合特性深入理解模型设计逻辑,重点关注Matlab代码中YALMIP工具包的应用与优化变量设置,配合网盘提供的完整资源进行代码调试与情景拓展,按文档结构循序渐进学习以构建系统化知识体系。

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧