c++ - 字符串插入和取消引用_问题_

标签 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);

这可行,但感觉不对。 -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/

相关文章:

c++ - 下界比较函数

c++ - STL 算法逐元素乘法(无求和)

c++ - csound 是否能够从互联网上提取简单的信息/数据?

c++ - 如何在 C++ 中声明 std::chrono::duration<double> 变量

c++ - 将字符串解析为两个 double

c - 段错误从函数返回字符串数组

c++ - 为什么我的 ".find"函数给我错误的值?

c++ - 为什么std::optional <bool>使用两个字节?

c++ - C++0x 仍然可以使用全局运算符 new 显式分配吗?

c++ - 在不创建拷贝的情况下访问作为 vector 成员的 map 元素