学习C++primer 第27天 之 小问题

jinjunweiruan 2008-07-29 07:52:52
问题比较多了。。。
1.能否实现这样的要求:“怎样让程序自动以空格区分是一个单词?”具体怎样实现?(比如 输入 i was a boy 能否让程序自动区别出是个单词?

2.int sum=accumulate(vec.begin(),vec.end(),42);//这里是什么?是先吧vec 中所有元素先加起来再和42相加。对吧

那这个
string sum=accumulat(v.begin(),vec.end(),string(" "));//这个呢?书上说是从空字符串开始,把vec里的每个元素连接成一个字符串.

我很疑惑的是这2个是一样的函数,为什么第一个是加上去,而第2个不是加上一个" "(空格).


3.使用了unique这个算法后,实际上并没有删除任何元素,而是将无重复的元素复制到序列的前端,从而覆盖相邻的重复元素.

那么原来重复的那个元素还能通过某种函数或什么找回来么??比如,我可能不想用这个unique的,用错了.怎么半?没有了?

4.谁给些文本查询的例子?用容器写的.最好有视频.我看写文本查询有点验证哦....
...全文
151 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
tangshuiling 2008-07-30
  • 打赏
  • 举报
回复
建议楼主在初学之际凡stl的跳过,先把基础的语法搞懂、搞通是重点!
summersdw1 2008-07-30
  • 打赏
  • 举报
回复
primer 里泛型算法还是值得学习一下的

补充一点:accumulate的第三个参数的必要目的是为了让算法知道累加类型而已
yujie_v 2008-07-29
  • 打赏
  • 举报
回复
问的很细致,不过回答……
赵Andy 2008-07-29
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 matrixdwy 的回复:]
1.能否实现这样的要求:“怎样让程序自动以空格区分是一个单词?”具体怎样实现?(比如 输入  i was a boy 能否让程序自动区别出是个单词?
//输入流本来就是自动以whitespace(空格,tab,换行符)来分割输入的。

2.int sum=accumulate(vec.begin(),vec.end(),42);//这里是什么?是先吧vec 中所有元素先加起来再和42相加。对吧
那这个
string sum=accumulat(v.begin(),vec.end(),string(" "));//这个呢?书上说是从空字符串…
[/Quote]
1.如果单纯的用cin>>str;的话就可以看出它只能读whitespace前的字符。
2. accumnulate()中的string("")是用来表示要累加的数据的类型的。最后生成的是一个字符串,所以也不会显示"".
不知是否正确,请各位指教。
jay的Fans 2008-07-29
  • 打赏
  • 举报
回复
1.如果你是想分离单词的话,可以用stringstrem
2.这是源码 // TEMPLATE FUNCTION accumulate
template<class _InIt,class _Ty> inline
_Ty _Accumulate(_InIt _First, _InIt _Last, _Ty _Val)
{ // return sum of _Val and all in [_First, _Last)
_DEBUG_RANGE(_First, _Last);
for (; _First != _Last; ++_First)
_Val = _Val + *_First;
return (_Val);
}
很明显是在_Val的基础上增加的
3.原容器中的那些重复值已经被覆盖掉了,怎么能重新找回,除非你有原容器的副本。
4.。。。
hahaysw 2008-07-29
  • 打赏
  • 举报
回复
回一楼的问题:
multimap和multiset可以同时存在多个key.而且它们默认情况下是从小到大排序的。
比如存在这样的multiset:1 2 3 4 5 5 5 5 6 7 8 9
m.lower_bound(5)返回指向第5个元素5的迭代器
m.upper_bound(5)返回指向第9个元素6的迭代器
其实lower_bound()和upper_bound()结合使用在有多个key的multimap和multiset中
就是为了找到相同key的元素段.这2个函数所得到的区间也是一个左闭又开[5,9)区间.
这在容器中是很常用的。
如果是map和set。set:1 2 3 4 5 6 7 8 9;
m.lower_bound(5)返回指向第5个元素5的迭代器
m.upper_bound(5)返回指向第6个元素6的迭代器
这样得出的区间很容易可以看出key是5的元素只有1个。

其实这个2个函数得出的区间根本不是左闭又开的区间,只是因为很多算法和迭代器运算的原理所造成的。
比如遍历for(iter=x.begin();iter!=x.end();++iter);
删除a.earse(b.begin(),b.end());
等等,总之左闭又开区间在stl中运用非常多

总结:这2个函数用在multimap和multiset比较有意义。

说得太多了,可能有错的地方。请大家指正下,我也是新人:)

matrixdwy 2008-07-29
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 matrixdwy 的回复:]
引用 1 楼 jinjunweiruan 的回复:
m.lower_bound(k)//返回一个迭代器,指向键不小于 k的第一个元素//这个的意思不就是等于k吗?
//“不小于k” 不等价于 “等于k”,可以是 ==k 也可以是>k
//1 2 3 4 6 7 8 9
//lower_bound(5)
//位置就是6的位置,也就是5“应该”出现的位置


m.upper_bound(k)//返回一个迭代器,指向大于k的第一个元素。。
//就是字面上的意思
[/Quote]
matrixdwy 2008-07-29
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 jinjunweiruan 的回复:]
m.lower_bound(k)//返回一个迭代器,指向键不小于 k的第一个元素//这个的意思不就是等于k吗?
//“不小于k” 不等价于 “等于k”,可以是 ==k 也可以是>k
//1 2 3 4 6 7 8 9
//lower_bound(5)
//位置就是6的位置,也就是5“应该”出现的位置

m.upper_bound(k)//返回一个迭代器,指向大于k的第一个元素。。
//就是字面上的意思
[/Quote]
matrixdwy 2008-07-29
  • 打赏
  • 举报
回复
1.能否实现这样的要求:“怎样让程序自动以空格区分是一个单词?”具体怎样实现?(比如 输入 i was a boy 能否让程序自动区别出是个单词?
//输入流本来就是自动以whitespace(空格,tab,换行符)来分割输入的。

2.int sum=accumulate(vec.begin(),vec.end(),42);//这里是什么?是先吧vec 中所有元素先加起来再和42相加。对吧
那这个
string sum=accumulat(v.begin(),vec.end(),string(" "));//这个呢?书上说是从空字符串开始,把vec里的每个元素连接成一个字符串.
我很疑惑的是这2个是一样的函数,为什么第一个是加上去,而第2个不是加上一个" "(空格).

//accumulate( )的第三个参数是初始值,内部的算法是:初始值+=容器中的每个元素
//而不是先累加每个容器中的元素,最后加上第三个参数


3.使用了unique这个算法后,实际上并没有删除任何元素,而是将无重复的元素复制到序列的前端,从而覆盖相邻的重复元素.
那么原来重复的那个元素还能通过某种函数或什么找回来么??比如,我可能不想用这个unique的,用错了.怎么半?没有了?
//找不回来
jinjunweiruan 2008-07-29
  • 打赏
  • 举报
回复
..哦 对了。大哥们
还有个
m.lower_bound(k)//返回一个迭代器,指向键不小于 k的第一个元素//这个的意思不就是等于k吗?
m.upper_bound(k)//返回一个迭代器,指向建大于k的第一个元素。。
这2句注释看不懂。看了1个小时。。闷。。。
大哥们举个例子啥的。。。
XX

64,654

社区成员

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

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