我正在尝试使用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());
答案 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::string
有a 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
提前一个。