如果我有一个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
Run Code Online (Sandbox Code Playgroud)
是reverse_copy()用绳子可用?reverse()似乎有效。
Gal*_*lik 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';
Run Code Online (Sandbox Code Playgroud)
目前你正在写过去的结束的B导致未定义行为。
执行此操作的另一种方法是使用称为的特殊迭代器std::back_insert_iterator,该迭代器将字符推入目标字符串的后面:
std::string A = "abc";
std::string B;
std::reverse_copy(A.begin(), A.end(), std::back_inserter(B));
Run Code Online (Sandbox Code Playgroud)
该std::back_inserter()函数std::back_insert_iterator将为您提供的字符串作为参数(或任何实现的容器push_back(),例如std::string::push_back())返回一个。
注意: 使用标准迭代器调用的std :: reverse_copystd::string(如本例所示)将仅反转字符串的代码单元,而不必反转字符(取决于编码)。例如UTF-8,包含多字节字符的编码字符串将无法通过此功能正确反转,因为多字节序列也会被反转,从而使它们无效。
Dmi*_*don 18
std::reverse_copy不分配空间,因此您的代码导致未定义的行为。预先分配空间:
string A = "abc";
string B;
B.resize(A.size());
reverse_copy(A.begin(),A.end(),B.begin());
cout<<B<<endl;
Run Code Online (Sandbox Code Playgroud)
或使用std::back_inserter:
string A = "abc";
string B;
reverse_copy(A.begin(),A.end(),std::back_inserter(B));
cout<<B<<endl;
Run Code Online (Sandbox Code Playgroud)
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";
Run Code Online (Sandbox Code Playgroud)