在C++中旋转数组的最后n个元素

在C++中旋转数组的最后n个元素,c++,arrays,string,C++,Arrays,String,我正在尝试实现一个函数,该函数从当前索引所在的字符串中删除一个字符。下面是到目前为止我所掌握的基本情况。我试图将要删除的字符旋转到字符串的末尾,然后用空终止符替换它。下面的代码似乎并没有实际旋转缓冲区,因为我得到的输出是wor,而不是预期的输出wrd int main() { char buffer[]="word"; int currIndex=2; int endIndex=strlen(buffer); currIndex--; endIndex--

我正在尝试实现一个函数,该函数从当前索引所在的字符串中删除一个字符。下面是到目前为止我所掌握的基本情况。我试图将要删除的字符旋转到字符串的末尾,然后用空终止符替换它。下面的代码似乎并没有实际旋转缓冲区,因为我得到的输出是wor,而不是预期的输出wrd

int main() {
    char buffer[]="word";
    int currIndex=2;
    int endIndex=strlen(buffer);
    currIndex--;
    endIndex--;

    rotate(buffer+currIndex,
        buffer+1,
        buffer+strlen(buffer));
    buffer[endIndex]='\0';
    cout << buffer << endl;

    return 0;
}

使用std::string使事情变得更简单,因为我不必考虑指针:

std::string buffer="word";
rotate(buffer.begin()+1, buffer.begin()+2, buffer.end());
buffer.resize(buffer.size()-1);
或者,我们可以使用c型阵列:

char buffer[]="word";
rotate(buffer+1, buffer+2, buffer+4);
buffer[3] = '\0';
接受3个参数:

template< class ForwardIt >
ForwardIt rotate( ForwardIt first, ForwardIt n_first, ForwardIt last );
实际上非常接近。你刚刚把第二个论点搞错了。应该是的

rotate(buffer+currIndex,
    buffer+2,
    buffer+strlen(buffer));
buffer[endIndex]='\0';

但是不可否认,用递增和递减编写的代码有点混乱。

使用std::string使事情变得更容易,因为我不必考虑指针:

std::string buffer="word";
rotate(buffer.begin()+1, buffer.begin()+2, buffer.end());
buffer.resize(buffer.size()-1);
或者,我们可以使用c型阵列:

char buffer[]="word";
rotate(buffer+1, buffer+2, buffer+4);
buffer[3] = '\0';
接受3个参数:

template< class ForwardIt >
ForwardIt rotate( ForwardIt first, ForwardIt n_first, ForwardIt last );
实际上非常接近。你刚刚把第二个论点搞错了。应该是的

rotate(buffer+currIndex,
    buffer+2,
    buffer+strlen(buffer));
buffer[endIndex]='\0';

但是不可否认,用递增和递减编写的代码有点混乱。

这并不是为了回答所提出的问题,而是为了解决根本问题:从字符串中删除单个字符

解决方案是类成员的简单应用程序:

#include <string>
#include <iostream>

int main() {
    std::string word{ "word" };
    std::string::size_type currIndex{ 2 };
    word.erase( currIndex, 1 );
    std::cout << word << std::endl;
}

这并不试图回答所问的问题,而是解决了根本问题:从字符串中删除单个字符

解决方案是类成员的简单应用程序:

#include <string>
#include <iostream>

int main() {
    std::string word{ "word" };
    std::string::size_type currIndex{ 2 };
    word.erase( currIndex, 1 );
    std::cout << word << std::endl;
}

你可以使用std::string吗?我不太明白你的解释。假设你想在角色e的abcdef中旋转。预期输出大于efabcd?我说的对吗?@ovanes根据您的输入,我希望从rotate调用中返回abcdfe,然后在将最后一个索引设置为null终止符后得到abcdf的最终输出。请注意,预期的输出是wod,而不是wrd。数组索引为零,C++为基础。你可以使用std::string吗?我不太明白你的解释。假设你想在角色e的abcdef中旋转。预期输出大于efabcd?我说的对吗?@ovanes根据您的输入,我希望从rotate调用中返回abcdfe,然后在将最后一个索引设置为null终止符后得到abcdf的最终输出。请注意,预期的输出是wod,而不是wrd。数组索引为零,C++为基础。我相信整个角色的旋转只是OP提出的解决问题方案的一部分。实际的解决办法是。谢谢!更一般的解决方案是:rotatebuffer+currIndex、buffer+currIndex+1、buffer+strlenbuffer@我觉得:这是一个愚蠢的意义。跳出框框思考的方式!将此作为答案发布后,您将获得meI的肯定支持。meI相信,整个角色轮换只是OP针对其问题提出的解决方案的一部分。实际的解决办法是。谢谢!更一般的解决方案是:rotatebuffer+currIndex、buffer+currIndex+1、buffer+strlenbuffer@我觉得:这是一个愚蠢的意义。跳出框框思考的方式!把它贴出来作为答案,我保证会投你一票