这很容易做,但似乎很难做到正确。让我假装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);
这有效但感觉不对。 A -1和+1 ......这很奇怪。
复制到最后一个字母的正确方法是什么?
答案 0 :(得分:4)
这有效,但这是未定义的行为,因为我正在引用最后一个字母。
不,你没有取消引用过去的最后一封信。您正在使用“最后一个字母后面的一个字符”的地址,但标准明确允许这样做。
这种语言在C ++标准中很常见:
24.2.1.5:正如指向数组的常规指针一样,保证指针值指向数组的最后一个元素,因此对于任何迭代器类型,都有一个迭代器值指向相应的最后一个元素。序列
基本上,任何指向任何数组末尾的指针P
都被认为是有效的。迭代器也是如此。
尝试读取或写入sz[sz.size()]
确实是错误的,但是你的代码没有这样做:标准库总是将结束指针解释为“一个接一个”,所以你绝对安全与
szout.insert(szout.end(), &sz[l], &sz[sz.size()]);