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

时间:2017-06-15 19:49:16

标签: c++ arrays string

我试图实现一个从当前索引所在的字符串中删除字符的函数。下面是我到目前为止的骨架。我试图将要删除的字符旋转到字符串的末尾,然后用空终止符替换它。我下面的代码似乎没有实际旋转缓冲区,因为我得到的输出是" 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;
}

2 个答案:

答案 0 :(得分:4)

这不会尝试回答被问到的问题,而是解决根本问题:从字符串中删除单个字符。

解决方案是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;
}

答案 1 :(得分:1)

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

std::string buffer="word";
rotate(buffer.begin()+1, buffer.begin()+2, buffer.end());
buffer.resize(buffer.size()-1);

Demo

或者,我们可以坚持使用c风格的数组:

char buffer[]="word";
rotate(buffer+1, buffer+2, buffer+4);
buffer[3] = '\0';

Demo2

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

实际上非常接近。你刚才得到了第二个论点。应该是

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

但无可否认,代码在增量和减量方面都有点令人困惑。