字符串不会使用reverse_copy反转

问题描述 投票:38回答:3

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

c++
3个回答
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';

目前你正在写B结束导致未定义的行为。

另一种方法是使用一个名为std::back_insert_iterator的特殊迭代器,它将字符推送到目标字符串的后面:

std::string A = "abc";
std::string B;

std::reverse_copy(A.begin(), A.end(), std::back_inserter(B));

std::back_inserter()函数为您提供的字符串返回std::back_insert_iterator作为参数(或任何实现push_back()的容器,例如std::string::push_back())。

注意:使用标准std::reverse_copy迭代器调用的std::string(如本例所示)将简单地反转字符串的代码单元,而不一定是字符(取决于编码)。例如,包含多字节字符的UTF-8编码字符串将无法通过此函数正确反转,因为多字节序列也将被反转,使其无效。


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;

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";
© www.soinside.com 2019 - 2024. All rights reserved.