2

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

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

4

1 回答 1

4

这行得通,但这是未定义的行为,因为我正在忽略最后一个字母。

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

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

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

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

但是,尝试读取或写入sz[sz.size()]确实是错误的,但是您的代码没有这样做:标准库始终将结束指针解释为“结束指针”,因此您绝对安全

szout.insert(szout.end(), &sz[l], &sz[sz.size()]);
于 2013-02-25T00:30:53.493 回答