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

copying single character using std::copy

本文关键字:单个 字符 复制 copy std 使用      更新时间:2023-10-16

我正在尝试使用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());

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

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

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

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

写入:

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的字符数。

在您的情况下,您可以简单地执行:

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

由于std::string有一个构造函数,它使用两个迭代器来复制其内容。

现在来解释一下:

std::copy(itr1, itr2, res)复制从itr1开始并在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的所有元素。

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