如果我有一个字符串A
等于"abc"
,并且我想拥有一个字符串B
,它是字符串A
的相反形式,为什么我不能使用reverse_copy()
要这样做吗?
std::string A = "abc";
std::string B;
std::reverse_copy(A.begin(), A.end(), B.begin());
std::cout << B << std::endl; // no output
reverse_copy()
是否可以与字符串一起使用? reverse()
似乎有用。
答案 0 :(得分:56)
您要复制到的string
太短(零长度)。您必须使其足够长以接受复制的数据:
std::string A = "abc";
std::string B;
B.resize(A.size()); // make B big enough
std::reverse_copy(A.begin(), A.end(), B.begin());
std::cout << B << '\n';
当前,您正在写{em>的末尾 ,引起不确定的行为。
执行此操作的另一种方法是使用称为std::back_insert_iterator
的特殊迭代器,该迭代器将字符推入目标字符串的后面:
B
std::back_inserter()
函数为您提供的作为参数(或实现std::string A = "abc";
std::string B;
std::reverse_copy(A.begin(), A.end(), std::back_inserter(B));
的任何容器,例如std::back_insert_iterator
的字符串)返回std::string::push_back()
。
注意::使用标准push_back()
迭代器(如本例所示)调用的std::reverse_copy只会颠倒字符串的代码单元,而不会必要字符(取决于编码)。例如,包含多字节字符的std::string
编码的字符串将无法通过此函数正确反转,因为多字节序列也会被反转,从而使其无效。
答案 1 :(得分:18)
std::reverse_copy
不分配空间,因此您的代码导致未定义的行为。要么预先分配空间:
string A = "abc";
string B;
B.resize(A.size());
reverse_copy(A.begin(),A.end(),B.begin());
cout<<B<<endl;
或使用std::back_inserter
:
string A = "abc";
string B;
reverse_copy(A.begin(),A.end(),std::back_inserter(B));
cout<<B<<endl;
答案 2 :(得分:9)
std::reverse_copy
期望目的地中有预先分配的空间,因此您需要以下内容:
std::string a = "abc";
std::string b(a.size(), ' ');
std::reverse_copy(std::begin(a), std::end(a), std::begin(b);
std::cout << b << "\n";