在向量的开头和结尾添加

Wel*_*len 0 c++ vector

在向量的开始处添加向量本身的最后两个元素,并在向量的末尾添加向量的前两个元素,哪一种是最聪明的方法?我的意思是,如果我的起始向量是

v = 1 2 3 4 5 6 7 8 9
Run Code Online (Sandbox Code Playgroud)

我需要它成为

v = 8 9 1 2 3 4 5 6 7 8 9 1 2
Run Code Online (Sandbox Code Playgroud)

Ste*_*sop 5

首先,如果容器将变大,请考虑使用deque代替vector。从一开始就添加起来效率更高。

因为vector您不能vector从头开始插入元素,因为发生的第一件事是向量中的所有内容都被移动了(所有迭代器和对这些元素的引用都无效了)。因此,您要么需要从向量中复制元素,要么需要将插入元素放在开始位置,然后将其复制分配给它们。假设类型为int,我将使用前者:

if (v.size() >= 2) {
    int tmp[] = {*(v.end() - 2), *(v.end() - 1)};
    v.insert(v.begin(), tmp, tmp + 2);
    tmp[0] = v[2]; tmp[1] = v[3];
    v.insert(v.end(), tmp, tmp + 2);
}
Run Code Online (Sandbox Code Playgroud)

或者,这会使用更多的内存,但可能更易于阅读。作为奖励,即使对于其复制构造函数可能抛出的类型,它也提供了强大的异常保证。可以通过添加对的调用来使上面的代码提供有力的保证reserve,但这仅仅是因为它int是一个琐碎的类型:

if (v.size() >= 2) {
    std::vector<int> new_v;
    new_v.reserve(v.size() + 4);
    new_v.insert(new_v.end(), v.end() - 2, v.end());
    new_v.insert(new_v.end(), v.begin(), v.end());
    new_v.insert(new_v.end(), v.begin(), v.begin() + 2);
    v.swap(new_v);
}
Run Code Online (Sandbox Code Playgroud)

因为deque您不需要在容器外部存储任何元素,只要您使用引用而不是迭代器即可访问它们。同样,这仅提供基本的异常保证。

if (v.size() >= 2) {
    v.push_front(v.back());
    v.push_front(*&(v.end() - 1));
    v.push_back(*&(v.begin() + 2));
    v.push_back(*&(v.begin() + 3));
}
Run Code Online (Sandbox Code Playgroud)