0

std::string 构造函数的网站 cplusplus 文档部分采用两个输入迭代器状态:

以相同的顺序复制 [first,last) 范围内的字符序列。

first, last:输入迭代器到一个范围内的初始和最终位置。使用的范围是[first,last),包括first和last之间的所有字符,包括first指向的字符但不包括last指向的字符。

这在退化的情况下意味着什么first == last?一方面first包含,另一方面last排除?官方 C++ 标准说在这种情况下应该发生什么?是否应该抛出异常?

4

4 回答 4

4

我不知道您正在阅读什么文档,但标准说(§21.4.2/15):

[..] 从范围内的值构造一个字符串[begin, end),如序列要求表中所示

序列要求表(表 100)将X a(i, j)有效范围定义[i, j)为:

构造一个与范围相等的序列容器[i, j)

当第二个迭代器可以从第一个迭代器到达时(通过递增),范围是有效的。对于两个相等的迭代器,范围为空。见§24.2.1/7:

范围是一对指定计算开始和结束的迭代器。范围[i,i)是一个空范围;一般来说,范围[i,j)是指数据结构中的元素,从 指向的元素开始,i直到但不包括 指向的元素j[i,j)当且仅当j可从 到达时,范围才有效i。将库中的函数应用于无效范围的结果是未定义的。

因此,如果first == last,如您所说,您将得到一个空字符串。如果last无法从 访问first,则您的行为未定义。

于 2013-02-28T18:17:39.990 回答
3

范围为空,因此没有可复制的内容。结果是一个空字符串。

于 2013-02-28T18:16:56.343 回答
2

在 first == last 的退化情况下,这意味着什么?

这意味着输入范围为空,因此字符串将为空。

标准说在这种情况下应该发生什么?

C++11 24.2.1/7 说:

范围[i,i)是一个空范围

于 2013-02-28T18:17:05.267 回答
0

我已经多次使用它的一件事是std::string从大型 C 风格字符串 ( const char*) 中的子字符串构造 a。您可以将两个const char*指针传递给它,它将从第一个指针开始并在第二个指针之前结束的字符构造一个字符串。

如果first == last,则结果为空字符串。如果first > last,则行为未定义(感谢 Mooing Duck)

于 2013-02-28T18:18:34.513 回答