字符串不会使用reverse_copy反向

时间:2019-05-01 16:46:39

标签: c++

如果我有一个字符串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()似乎有用。

3 个答案:

答案 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";