使用std :: copy复制单个字符

时间:2011-06-22 12:53:41

标签: c++ stl

我正在尝试使用std::copy从两个不同的迭代器进行复制。但在执行过程中,这两个迭代器可以指向同一位置。为什么在这种情况下他们不会复制单个字符。

std::string str1 = "ABC";
std::string::iterator itr1 = str1.begin();
std::string::iterator itr2 = str1.begin();
std::string result;
std::copy(itr1,itr2,result.begin());

4 个答案:

答案 0 :(得分:7)

STL中范围的右边界不包括在内。如果给它两次相同的迭代器,结果是一个空范围。你想要这个:

std::copy(itr1,itr2+1,result.begin());

但是,请注意您正在写入没有保留内存的位置,这是未定义的行为。您必须使用back_insert_iterator

std::copy(itr1,itr2 + 1, std::back_inserter(result));

答案 1 :(得分:2)

写:

result.resize(1); //it must have some size
std::copy(itr1,itr2 + 1,result.begin());

或者更好。

//no need to resize now!
std::copy(itr1,itr2 + N, std::back_inserter(result));

其中N是您要复制到result的字符数。

答案 2 :(得分:1)

在您的情况下,您可以这样做:

std::string result(itr1, itr1 + 1);

由于std::stringa constructor,需要两个迭代器来复制其内容。

现在解释:

std::copy(itr1, itr2, res)复制从itr1开始的所有元素,并在<{strong> itr2之前停止res指定的位置。

也就是说,如果itr1 == itr2两个迭代器之间没有“间隙”,则不会复制任何内容。

这就是end()迭代器通常指向集合的最后一个元素的原因。


考虑以下向量vec,它有3个元素:

1, 2, 3, X
^        ^
|        | 
|        \-- end() (X indicates a slot past the last element)
\----------- begin()

也就是说,如果您将std::copy()begin()end()一起使用,则实际上会复制vec的所有元素。

答案 3 :(得分:0)

copy()的第二个参数是复制最后一个后的元素; str1.end()将指向最后一个字符,而不是它之前。你的电话要求复制0个字符,这就是你得到的。在拨打电话之前,您可以将itr2提前一个。