Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;向量元素';指数 #包括 #包括 int main() { 向量v={1,2,3,4}; }_C++_Algorithm_Vector_Rotation - Fatal编程技术网

C++ C++;向量元素';指数 #包括 #包括 int main() { 向量v={1,2,3,4}; }

C++ C++;向量元素';指数 #包括 #包括 int main() { 向量v={1,2,3,4}; },c++,algorithm,vector,rotation,C++,Algorithm,Vector,Rotation,是否有一种有效的方法将“4”推到1的位置,并将其他元素推到下一个索引。所以向量的元素顺序是{4,1,2,3}。我已经想到了一些方法,但我想知道是否有一个优雅和更有效的方法来做到这一点 提前谢谢 这看起来是为std::rotate量身定做的: #include <iostream> #include <vector> int main() { std::vector<int> v = {1, 2, 3, 4}; } 例如,您可以使用标准算法std::r

是否有一种有效的方法将“4”推到1的位置,并将其他元素推到下一个索引。所以向量的元素顺序是{4,1,2,3}。我已经想到了一些方法,但我想知道是否有一个优雅和更有效的方法来做到这一点


提前谢谢

这看起来是为std::rotate量身定做的:

#include <iostream>
#include <vector>

int main()
{

std::vector<int> v = {1, 2, 3, 4};

 }

例如,您可以使用标准算法
std::rotate

std::rotate(v.begin(), v.begin()+3, v.end());
#include <iostream>
#include <algorithm>
#include <vector>
#include <iterator>

int main() 
{
    std::vector<int> v = {1, 2, 3, 4};

    for ( int val : v ) std::cout << val << ' ';
    std::cout << std::endl;

    std::rotate( std::begin( v ), std::prev( std::end( v ) ), std::end( v ) );

    for ( int val : v ) std::cout << val << ' ';
    std::cout << std::endl;

    return 0;
}
在这两种情况下,输出都是

#include <iostream>
#include <vector>
#include <cstring>

int main() 
{
    std::vector<int> v = {1, 2, 3, 4};

    for ( int val : v ) std::cout << val << ' ';
    std::cout << std::endl;

    int value = v.back();
    std::memmove( v.data() + 1, v.data(), ( v.size() - 1 ) * sizeof( int ) );
    v[0] = value;

    for ( int val : v ) std::cout << val << ' ';
    std::cout << std::endl;

    return 0;
}

您尚未向我们展示您的解决方案,因此如果我们知道更优雅或更高效的解决方案,我们将无法告知您。此外,如果您有一个有效的解决方案,那么这个问题可能会更好,但您必须提供代码。答案提供了一个简单的解决方案,但效率不高。你要的东西放错容器了。Vector非常擅长于它的设计目的,所以我假设您出于其他原因需要Vector,但它不会像list或deque那样快速旋转。(假设数据量很大)这个问题的常见答案是根本不改变向量,而是改变你访问的索引值。建议使用memmove而不是rotate似乎不是一个好主意。如果您的编译器供应商没有为rotate生成好的代码,可能会向他们投诉?@Marglisse我认为与其向供应商投诉,不如在需要时编写高效的代码。:)
1 2 3 4 
4 1 2 3