字符串插入和取消引用_problem_

时间:2013-02-25 00:28:30

标签: c++ string stl

这很容易做,但似乎很难做到正确。让我假装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 ......这很奇怪。

复制到最后一个字母的正确方法是什么?

1 个答案:

答案 0 :(得分:4)

  

这有效,但这是未定义的行为,因为我正在引用最后一个字母。

不,你没有取消引用过去的最后一封信。您正在使用“最后一个字母后面的一个字符”的地址,但标准明确允许这样做。

这种语言在C ++标准中很常见:

  

24.2.1.5:正如指向数组的常规指针一样,保证指针值指向数组的最后一个元素,因此对于任何迭代器类型,都有一个迭代器值指向相应的最后一个元素。序列

基本上,任何指向任何数组末尾的指针P都被认为是有效的。迭代器也是如此。

尝试读取或写入sz[sz.size()]确实是错误的,但是你的代码没有这样做:标准库总是将结束指针解释为“一个接一个”,所以你绝对安全与

szout.insert(szout.end(), &sz[l], &sz[sz.size()]);