为什么insert的返回是个void类型

baidu_26788877 2016-04-22 10:31:32



...全文
387 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
anglaberber 2018-07-14
  • 打赏
  • 举报
回复
楼主你好 , 估计你和我看的是同一本书 《 C++ Primer 》 , 同样用的也是GCC , 呵呵 ,问题也是同一个问题 , 不过我找到了一个有效的解决办法 :

你使用insert范围插入的返回值 , 无非是想保存插入后已经更新的迭代器 , 不管insert后是会使string的size超过capacity还是不超过 , 返回值总是正确的 , 但是我们没有返回值 , 因此只能确保不超过capacity的插入操作的前提下自己计算出更新后的迭代器 ( 如果插入后 size超过capacity 就会另外分配空间 , 计算是无法跨过两个不相干的内存空间的 , 因此 要 确保 string的capacity足够大 ) , 看下面代码就明白如何计算啦 :

#include <string>
using std::string;

#include <iostream>

//s的大小如果直接初始化的话 capacity 和 size是一样大小的 , 也就是说 newVal 只要 比 oldVal 长 , 下面代码就是错的。
//因此在初始化完string以后 , reserve给string足够的capacity
void Replace(string& s, const string& oldVal, const string& newVal)
{

for ( string::iterator beg = s.begin(); std::distance(beg, s.end()) >= std::distance(oldVal.begin(), oldVal.end()); ) //原串的比较部分必须比子串的长度长才行
{

if(string(beg, beg + oldVal.size()) == oldVal)
{

string::iterator pre = beg-1; //将pre指向 beg 的前一个 , 不超过capacity的插入 , 只会使 插入 / 删除位置后的迭代器失效 , pre 不失效
beg = s.erase(beg, beg + oldVal.size());
s.insert(beg, newVal.begin(), newVal.end());
std::advance(pre, newVal.size()); //将pre指向 插入字符串的最后一个字符
}
++beg;
}

}

int main()
{
{
string str("Tod drive straight thru is a foolish,thocourageousact.");
std::cout << str.capacity() << " " << str.size()<< std::endl; //打印输出是一样大的
str.reserve(1024); //至关重要
Replace(str, "thru", "through");
std::cout << str << std::endl;
//Replace(str, "tho", "though");

}
getchar();
return 0;
}


研究了快2个小时 , 终于搞明白了 , 迫不及待和楼主分享一下 , 哈哈
baidu_26788877 2016-04-23
  • 打赏
  • 举报
回复
引用 8 楼 dustpg 的回复:
这个C++11不是只是编译器支持的C++11, 是标准库. 微软为IDE提供了配套的标准库,其他编译器标准库都是(算是)第三方(比如libc++)写的. 所以应该升级标准库而不是仅仅是编译器
刚刚在linux下用G++还是一样 标准库该怎么升级,谢谢啊。。
baidu_26788877 2016-04-23
  • 打赏
  • 举报
回复
贴上源码,谁帮我调试看这个想法行不行
#include <string> #include <iostream> using namespace std; void Replace(string s, string oldVal, string newVal) { auto sit = s.begin(); while(sit!=s.end()) { auto oldit = oldVal.begin(); while(sit!=s.end() && oldit!=oldVal.end() && *sit==*oldit) { ++sit; ++oldit; } if (oldit==oldVal.end()) { sit = s.erase(sit - oldVal.size(), sit); sit = s.insert(sit, newVal.begin(), newVal.end()); sit += newVal.size(); } else if (sit == s.end()) return; else ++sit; } return; } int main() { string txt{"abc abc abc bcd efg efg hi hi"}; Replace(txt, "abc", "ABC"); for(auto t: txt) cout << t << ends; return 0; }
赵4老师 2016-04-23
  • 打赏
  • 举报
回复
不要迷信书、考题、老师、回帖; 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实! 有人说一套做一套,你相信他说的还是相信他做的? 其实严格来说这个世界上古往今来所有人都是说一套做一套,不是吗?
baidu_26788877 2016-04-22
  • 打赏
  • 举报
回复
引用 8 楼 dustpg 的回复:
这个C++11不是只是编译器支持的C++11, 是标准库. 微软为IDE提供了配套的标准库,其他编译器标准库都是(算是)第三方(比如libc++)写的. 所以应该升级标准库而不是仅仅是编译器
谢谢 我还是尽早换成VS算了
dustpg 2016-04-22
  • 打赏
  • 举报
回复
这个C++11不是只是编译器支持的C++11, 是标准库. 微软为IDE提供了配套的标准库,其他编译器标准库都是(算是)第三方(比如libc++)写的. 所以应该升级标准库而不是仅仅是编译器
baidu_26788877 2016-04-22
  • 打赏
  • 举报
回复
引用 6 楼 qq423399099 的回复:
[quote=引用 5 楼 baidu_26788877 的回复:] [quote=引用 4 楼 qq423399099 的回复:] 2楼说的应该是对的 可以参考:http://www.cplusplus.com/reference/list/list/insert/ 楼主的编译器是不是没有完全支持C++11,只是部分支持C++11
谢谢 我用的dev c++TDM-GCC 4.9.2 64-bit Release[/quote] Dev-C++集成的gcc版本4.7以上的应该就行。楼主加上“-std=c++11”参数来编译试试[/quote] 我有加了的啊 链接那里需要加吗
小灸舞 2016-04-22
  • 打赏
  • 举报
回复
引用 5 楼 baidu_26788877 的回复:
[quote=引用 4 楼 qq423399099 的回复:] 2楼说的应该是对的 可以参考:http://www.cplusplus.com/reference/list/list/insert/ 楼主的编译器是不是没有完全支持C++11,只是部分支持C++11
谢谢 我用的dev c++TDM-GCC 4.9.2 64-bit Release[/quote] Dev-C++集成的gcc版本4.7以上的应该就行。楼主加上“-std=c++11”参数来编译试试
baidu_26788877 2016-04-22
  • 打赏
  • 举报
回复
引用 4 楼 qq423399099 的回复:
2楼说的应该是对的 可以参考:http://www.cplusplus.com/reference/list/list/insert/ 楼主的编译器是不是没有完全支持C++11,只是部分支持C++11
谢谢 我用的dev c++TDM-GCC 4.9.2 64-bit Release
小灸舞 2016-04-22
  • 打赏
  • 举报
回复
2楼说的应该是对的 可以参考:http://www.cplusplus.com/reference/list/list/insert/ 楼主的编译器是不是没有完全支持C++11,只是部分支持C++11
dustpg 2016-04-22
  • 打赏
  • 举报
回复
C++98 template <class InputIterator> void insert (iterator p, InputIterator first, InputIterator last); C++11 template <class InputIterator> iterator insert (iterator p, InputIterator first, InputIterator last);
baidu_26788877 2016-04-22
  • 打赏
  • 举报
回复
引用 2 楼 dustpg 的回复:
C++98 template <class InputIterator> void insert (iterator p, InputIterator first, InputIterator last); C++11 template <class InputIterator> iterator insert (iterator p, InputIterator first, InputIterator last);
我用的是C++11啊 你看我都用auto了的
baidu_26788877 2016-04-22
  • 打赏
  • 举报
回复
书里说的是返回一个迭代器,但是提示的是返回一个void

64,637

社区成员

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

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