使用std::copy复制单个字符
copying single character using std::copy
我正在尝试使用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
提前一个。
相关文章:
- 如何读取单个字符并在输入两个字符序列时输出? 使用 while 循环和C++
- 为什么char不是单个字符
- C++ 字符串单个字符
- 将单个字符转换为 std::string 前缀 \x01
- 尝试一次将单个字符读取到大小不确定的数组中
- C++ 如何将字符串拆分为单个字符
- 如何在C++中将单个字符哈希为相对较小的素数?
- 如何将像'A'这样的单个字符替换为类似"10"?
- 我通过迭代加法将二进制数转换为十进制并检查单个字符(请参阅代码)的方法有什么问题?
- std::bad_alloc 将文本文件中的单个字符存储到矢量C++中时
- 如何从用户那里获取单个字符,直到他输入"."或输入
- 字符串中单个字符作为数组的数据类型是什么
- 字符串中的重音,如何在单个字符中存储重音字符
- 从字符串中提取单个字符并将其转换为 int
- 如何将单个字符转换为为基本密码哈希器设置整数,C++
- 下推解析器是否扫描令牌或单个字符
- 如何定义一个从任何编码空间解析单个字符的精神 x3 解析器?
- C :占用更多内存,将单个字符作为char或字符串存储
- 如何从字符串中读取单个字符
- WM_GETTEXT只返回单个字符