C++ 使用C+旋转字符串+;
可能重复:C++ 使用C+旋转字符串+;,c++,string,C++,String,可能重复: 我在C++中应用了一个命令行输入程序。我正在命令行中输入一个字符串 int main(int argc, char** argv) { if(argc != 2) { cerr << "Invalid number of CMD arguments" << endl; return 1; } string StringVal
我在C++中应用了一个命令行输入程序。我正在命令行中输入一个字符串
int main(int argc, char** argv)
{
if(argc != 2)
{
cerr << "Invalid number of CMD arguments" << endl;
return 1;
}
string StringValue = argv[1];
cout << StringValue << endl;
}
其中“^”是开始“|”是结束。如何执行此操作?使用
std::rotate
string foo=“abcdefg”;
旋转(foo.begin(),foo.begin()+3,foo.end());
不能使用std::rotate
string foo=“abcdefg”;
旋转(foo.begin(),foo.begin()+3,foo.end());
如果你想自己实现
int main()
{
string StringValue = "^STATES|";
string aDoubleStr = StringValue;
aDoubleStr.append(StringValue);
for(int i = StringValue.length() - 1; i >= 0; i--)
{
string aNewStr = aDoubleStr.substr(i , StringValue.length());
cout << aNewStr.c_str() << endl;
}
return 0;
}
intmain()
{
字符串StringValue=“^STATES |”;
字符串aDoubleStr=StringValue;
aDoubleStr.append(StringValue);
对于(int i=StringValue.length()-1;i>=0;i--)
{
string aNewStr=aDoubleStr.substr(i,StringValue.length());
如果你想自己实现
int main()
{
string StringValue = "^STATES|";
string aDoubleStr = StringValue;
aDoubleStr.append(StringValue);
for(int i = StringValue.length() - 1; i >= 0; i--)
{
string aNewStr = aDoubleStr.substr(i , StringValue.length());
cout << aNewStr.c_str() << endl;
}
return 0;
}
intmain()
{
字符串StringValue=“^STATES |”;
字符串aDoubleStr=StringValue;
aDoubleStr.append(StringValue);
对于(int i=StringValue.length()-1;i>=0;i--)
{
string aNewStr=aDoubleStr.substr(i,StringValue.length());
cout我也希望Andrew的解决方案使用std::rotate()
。
但由于OP在评论中要求其他解决方案,我想在这里“推”一些其他想法。这一个不是很有效:
std::string value = "^STATES|";
size_t pos = 3;
value = value.substr(pos) + value.substr(0, pos);
这要追溯到道格·麦克罗伊、布赖恩·克尼根和p.J.普劳格(见乔恩·本特利:《编程珍珠》,第2章)。
双手并排握住,拇指朝同一方向。
(一只手放在另一只手上方,手掌放在身体上可能更容易。)
转动每只手,然后转动连接的双手:
_|||| _|||| => ||||_ ||||_ => _|||| _||||
\L / \ R/ \L / \ R/ \R / \ L/
在C++中:
std::string::iterator mid = value.begin() + pos;
std::reverse(value.begin(), mid);
std::reverse(mid, value.end());
std::reverse(value.begin(), value.end());
我还希望Andrew的解决方案使用std::rotate()
。
但由于OP在评论中要求其他解决方案,我想在这里“推”一些其他想法。这一个不是很有效:
std::string value = "^STATES|";
size_t pos = 3;
value = value.substr(pos) + value.substr(0, pos);
这要追溯到道格·麦克罗伊、布赖恩·克尼根和p.J.普劳格(见乔恩·本特利:《编程珍珠》,第2章)。
双手并排握住,拇指朝同一方向。
(一只手放在另一只手上方,手掌放在身体上可能更容易。)
转动每只手,然后转动连接的双手:
_|||| _|||| => ||||_ ||||_ => _|||| _||||
\L / \ R/ \L / \ R/ \R / \ L/
在C++中:
std::string::iterator mid = value.begin() + pos;
std::reverse(value.begin(), mid);
std::reverse(mid, value.end());
std::reverse(value.begin(), value.end());
如果我不想使用旋转函数的话?@user1554408:write your own)。但是为什么不使用为此目的创建的标准函数呢?是否可以在整个字符串中循环并更改字符串中某个字符的值?@user1554408:yes,可以:foo[2]='A';
@user1554408这样做是可能的,但是重新实现std::rotate
几乎没有意义,除非这是一个练习或家庭作业。如果我想在没有rotate函数的情况下执行它?@user1554408:编写您自己的)。但是为什么不使用为此目的创建的标准函数呢?是否可以在整个字符串中循环并更改字符串中字符的值?@user1554408:是的,有可能:foo[2]='A';
@user1554408这样做是可能的,但是重新实施std::rotate
几乎没有意义,除非这是一个练习或家庭作业。就地解决方案Viktor Latypov链接到上面的帖子是完全重复的。就地解决方案Viktor Latypov链接到上面的帖子是完全重复的。