如果我有一个字符串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()
似乎有效。
你试图复制的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
编码字符串将无法通过此函数正确反转,因为多字节序列也将被反转,使其无效。
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;
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";