C++ 如何在C+中反转2块中的字符串+;?

C++ 如何在C+中反转2块中的字符串+;?,c++,string,reverse,C++,String,Reverse,我要做的是转换字符串,例如 “a4b2f0”转换为“f0b2a4” 或者更简单地说: turning "12345678" into "78563412" 字符串将始终具有偶数个字符,因此它将始终除以2。我真的不知道从哪里开始。一个简单的方法是: std::string input = "12345678"; std::string output = input; std::reverse(output.begin(), output.end()); for(size_t i = 1 ; i

我要做的是转换字符串,例如 “a4b2f0”转换为“f0b2a4” 或者更简单地说:

turning "12345678" into "78563412"

字符串将始终具有偶数个字符,因此它将始终除以2。我真的不知道从哪里开始。

一个简单的方法是:

std::string input = "12345678";
std::string output = input;
std::reverse(output.begin(), output.end());
for(size_t i = 1 ; i < output.size(); i+=2)
    std::swap(output[i-1], output[i]);
std::cout << output << std::endl;
std::string input=“12345678”;
std::字符串输出=输入;
std::reverse(output.begin(),output.end());
对于(size_t i=1;i一种简单的方法是:

std::string input = "12345678";
std::string output = input;
std::reverse(output.begin(), output.end());
for(size_t i = 1 ; i < output.size(); i+=2)
    std::swap(output[i-1], output[i]);
std::cout << output << std::endl;
std::string input=“12345678”;
std::字符串输出=输入;
std::reverse(output.begin(),output.end());
对于(size_t i=1;i
我的方法使用了递归编程的强大功能

让我们来了解一下。。。(未经测试!:(而且绝对不是为处理奇数长度序列而构建的。)

typedef
结构反向对迭代器{
typedef I base_t;
基地(t基地),;
布尔平价;
反向对迭代器(base\u t base,奇偶校验=false):
基本(基本)、奇偶校验(奇偶校验){
++基础;
}
反向对迭代器运算符++(){
反向对迭代器结果(基,!奇偶校验);
if(奇偶校验){result.base++;result.base++;}
else{result.base-->}
返回结果;
}
};
模板
反向对迭代器生成bpi(I基){
返回向后\u对\u迭代器(基);
}
字符串输出(make_bpi(input.rbegin()),make_bpi(input.rend());
让我们开始深奥的…(未经测试!:(而且绝对不是为处理奇数长度序列而构建的。)

typedef
结构反向对迭代器{
typedef I base_t;
基地(t基地),;
布尔平价;
反向对迭代器(base\u t base,奇偶校验=false):
基本(基本)、奇偶校验(奇偶校验){
++基础;
}
反向对迭代器运算符++(){
反向对迭代器结果(基,!奇偶校验);
if(奇偶校验){result.base++;result.base++;}
else{result.base-->}
返回结果;
}
};
模板
反向对迭代器生成bpi(I基){
返回向后\u对\u迭代器(基);
}
字符串输出(make_bpi(input.rbegin()),make_bpi(input.rend());

一个简单的解决方案是:

string input = "12345678";
string output = "";

for(int i = input.length() - 1; i >= 0; i-2)
{
 if(i -1 >= 0){
 output += input[i -1];
 output += input[i];
 }
}

注意:当mod 2为=时,您应该检查字符串的长度,否则这将结束。请执行与上面类似的操作。

一个简单的解决方案是:

string input = "12345678";
string output = "";

for(int i = input.length() - 1; i >= 0; i-2)
{
 if(i -1 >= 0){
 output += input[i -1];
 output += input[i];
 }
}

注意:当mod 2为=时,您应该检查字符串的长度,否则这将结束。请像我上面所做的那样执行操作。

这里有两种可能-从第一对字符开始,或者从最后一对字符开始,这两种可能是相同的,因为它们都受每次交换的影响。您有两种可能e-要么从第一对字符开始,要么从最后一对字符开始,因为每一次交换都会影响到这两个字符。或者,粗略地说(可能涉及与编译器争吵):
std::reverse((char[][2])output.c_str(),(char[][2])(output.c_str()+output.length();
-)@Michael:这很讨厌!@dreamlax:但尝试起来很有趣@纳瓦兹:不,我说的是标准对这件事的看法
.c_str()
不一定是指向连续内部缓冲区的某种指针,因为与std::vector不同,std::string的存储不一定是连续的。此外,std::string实现不需要空终止其内部数据,而
.c_str()
返回的数据必须空终止,因为它是用于c API的(因此单独的
.c_str()
.data()
成员函数)。因此,
.c_str()
可能会被强制创建字符串的副本。
.c_str()
返回指向连续数据的指针。但实际存储不一定是连续的;因此,
.c_str()
返回的指针不一定指向实际字符串实例中的任何内容,因为根据实现的不同,这可能是不可能的。因此,对该指针指向的数据的操作不一定会影响字符串实例。此外,您还必须键入cast(并从技术上调用未定义的行为)进行尝试,因为根据
.c_str()
的返回类型,指向数据的是
const
。或者,粗略地说(可能涉及与编译器争吵):
std::reverse((char[][2])output.c_str和(char[][2])(output.c_str+output.length());-)@迈克尔:真讨厌@dreamlax:但尝试它很有趣@纳瓦兹:不,我说的是标准对这件事的看法
.c_str()
不一定是指向连续内部缓冲区的某种指针,因为与std::vector不同,std::string的存储不一定是连续的。此外,std::string实现不需要空终止其内部数据,而
.c_str()
返回的数据必须空终止,因为它是用于c API的(因此单独的
.c_str()
.data()
成员函数)。因此,
.c_str()
可能会被强制创建字符串的副本。
.c_str()
返回指向连续数据的指针。但实际存储不一定是连续的;因此,
.c_str()
返回的指针不一定指向实际字符串实例中的任何内容,因为根据实现的不同,这可能是不可能的。因此,对该指针指向的数据的操作不一定会影响字符串实例。此外,您还必须键入cast(并从技术上调用未定义的行为)来进行尝试,因为根据
.c_str()
的返回类型,指向数据的是
const
。您肯定希望在该返回类型上添加注释。我不能不盯着它看两分钟就知道它在干什么。那就是我,有趣的警察。但派对继续,我会的
string input = "12345678";
string output = "";

for(int i = input.length() - 1; i >= 0; i-2)
{
 if(i -1 >= 0){
 output += input[i -1];
 output += input[i];
 }
}