这很容易做到,但似乎很难正确做到。假设 l 是 size()/2。我想将 sz 的后半部分插入到 szout 中。
我的第一次尝试是
szout.insert(szout.end(), &sz[l], sz.end());
但是我遇到了一个很大的编译错误。接下来我尝试的是
szout.insert(szout.end(), &sz[l], &sz[sz.size()-1]);
不,缺少最后一个字母。所以显然我不应该-1
szout.insert(szout.end(), &sz[l], &sz[sz.size()]);
这可行,但这是未定义的行为,因为我正在引用最后一个字母。
szout.insert(szout.end(), &sz[l], &sz[sz.size()-1]+1);
这可行,但感觉不对。 -1 和 +1...这很奇怪。
复制到最后一个字母的正确方法是什么?
最佳答案
This works but this is undefined behavior because I'm deferencing past the last letter.
不,您不会取消引用最后一个字母之后的内容。您正在获取“最后一个字母后一个字符”的地址,但标准明确允许这样做。
这种语言在 C++ 标准中非常常见:
24.2.1.5: Just as a regular pointer to an array guarantees that there is a pointer value pointing past the last element of the array, so for any iterator type there is an iterator value that points past the last element of a corresponding sequence.
本质上,任何指向任何数组末尾的指针P
都被认为是有效的。迭代器也是如此。
尝试读取或写入 sz[sz.size()]
确实是错误的,但是您的代码没有这样做:标准库总是将结束指针解释为“一个过了终点”,所以你绝对安全
szout.insert(szout.end(), &sz[l], &sz[sz.size()]);
关于c++ - 字符串插入和取消引用_问题_,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15058414/