什么是std :: string(itr,itr)应该做什么?

时间:2013-02-28 18:11:38

标签: c++ iterator language-lawyer stdstring

std :: string构造函数的web site cplusplus documentation在两部分中采用两个输入迭代器状态:

  

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

     

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

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

4 个答案:

答案 0 :(得分: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,则表示您有未定义的行为。

答案 1 :(得分:3)

范围是空的,因此无需复制。结果是一个空字符串。

答案 2 :(得分:2)

  

这在堕落的情况下意味着什么?= = last?

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

  

在这种情况下标准会说什么?

C ++ 11 24.2.1 / 7说:

  

范围[i,i)是空范围

答案 3 :(得分:0)

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

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