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



我正在尝试实现一个函数,该函数从当前索引所在的字符串中删除字符。以下是我到目前为止所拥有的骨架。我正在尝试将要删除的字符旋转到字符串的末尾,然后将其替换为空终止符。我在下面的代码似乎并没有真正旋转缓冲区,因为我得到的输出是"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]='';
    cout << buffer << endl;
    return 0;
}

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

解决方案是 std::string::erase 类成员的简单应用:

#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 使事情变得更容易,因为我不必考虑指针:

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] = '';

演示2


std::rotate接受 3 个参数:

template< class ForwardIt >
ForwardIt rotate( ForwardIt first, ForwardIt n_first, ForwardIt last );

first是要左旋转的范围内的第一个元素。

nfirst是旋转后您希望位于范围开头的元素(这告诉算法有效地向左旋转多少次(

last是要旋转的范围内的最后一个元素。

您的代码:

char buffer[]="word";
int currIndex=2;
int endIndex=strlen(buffer);
currIndex--;
endIndex--;
rotate(buffer+currIndex,
    buffer+1,
    buffer+strlen(buffer));
buffer[endIndex]='';

实际上真的很接近。你只是弄错了第二个论点。它应该是

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

但不可否认,代码在增量和递减方面有点混乱。

最新更新