字符串不会使用reverse_copy反向

Som*_*ame 40 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
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,包含多字节字符的编码字符串将无法通过此功能正确反转,因为多字节序列也会被反转,从而使它们无效。

  • 当然,对于此应用程序(创建与A相反的新字符串B),一种更简单的方法是使用A的反向迭代器:const std :: string B(A.crbegin(), A.crend());` (13认同)
  • 另一个警告是,这些操作以char为单位,而不是Unicode字素(假定为UTF-8)。因此,如果您的字符串数据包含“有趣”字符,则可能无法正常工作。 (13认同)
  • [各种反转`std :: string`的方法](/sf/answers/3915826421/) (3认同)

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)


Pau*_*ans 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";
Run Code Online (Sandbox Code Playgroud)