如何将元素移动到向量的末尾?

时间:2016-06-18 20:27:35

标签: c++ vector erase push-back

int main(){
    std::vector<int> vec;
    vec.push_back(1);
    vec.push_back(2);
    vec.push_back(vec[0]);
    for (auto it = vec.begin(); it != vec.end(); it++) {
        std::cout << *it << std::endl;
    }
    return 0;
}

这输出[1,2,1],我理解,因为矢量正在复制vec [0]并将其推回。但是,我希望输出像[2,1],如果我可以在不使用push_back()然后必须使用erase();

的情况下完成此操作,这很奇怪

目标:我希望能够将矢量中的元素移动到结尾,而矢量相应地调整自身,所以如果我将第5个位置的元素移动到结尾,那么原始第5个位置之后的所有元素会向上移动,所以新的第5个位置会将元素放在旧的第6个位置,依此类推。

1 个答案:

答案 0 :(得分:7)

您可能正在寻找std::rotate

int main() {
    //Fill vector
    std::vector<int> vec;
    vec.push_back(1);
    vec.push_back(2);
    vec.push_back(3);

    //move first element to the end
    std::rotate(vec.begin(), vec.begin() + 1, vec.end());

    //print content
    for (auto e:vec) {
        std::cout << e << std::endl;
    }
}

参数说明:

  • 第一个和最后一个参数表示将移动的所有元素的范围(所以这里是整个容器)。
  • 第二个参数是旋转后落在第一个位置的元素的迭代器。当你想将第一个元素移动到结尾时,第二个元素就是一个(索引1)移动到前面。

基本上,您可以看到第二个参数和第一个参数(此处为1)之间的距离,作为元素的数量,通过该元素移动范围。