C++ 旋转向量中的元素以及如何返回向量

C++ 旋转向量中的元素以及如何返回向量,c++,vector,C++,Vector,这里是c++新手。因此,对于赋值,我必须将向量中的所有元素向左旋转。例如,元素{1,2,3}应该旋转到{2,3,1} 我正在研究如何做到这一点,我看到了rotate()函数,但考虑到我的代码,我认为这不起作用。然后我看到了一个for循环可以实现这一点,但我不确定如何将其转换为return语句。(我试图调整它,但失败了) 这是我到目前为止所得到的结果,但它是非常错误的(我还没有得到一个没有以错误结束的结果) 编辑:我要处理的向量大小只有三个,所以它不需要考虑任何大小的向量 #include <

这里是c++新手。因此,对于赋值,我必须将向量中的所有元素向左旋转。例如,元素{1,2,3}应该旋转到{2,3,1}

我正在研究如何做到这一点,我看到了rotate()函数,但考虑到我的代码,我认为这不起作用。然后我看到了一个for循环可以实现这一点,但我不确定如何将其转换为return语句。(我试图调整它,但失败了)

这是我到目前为止所得到的结果,但它是非常错误的(我还没有得到一个没有以错误结束的结果)

编辑:我要处理的向量大小只有三个,所以它不需要考虑任何大小的向量

#include <vector>
using namespace std;

vector<int> rotate(const vector<int>& v)
{
   // PUT CODE BELOW THIS LINE. DON'T CHANGE ANYTHING ABOVE.
   vector<int> result;
   int size = 3;
   for (auto i = 0; i < size - 1; ++i)
   {
       v.at(i) = v.at(i + 1);
       result.at(i) = v.at(i);
   }
   return result;
   // PUT CODE ABOVE THIS LINE. DON'T CHANGE ANYTHING BELOW.
}
#包括
使用名称空间std;
矢量旋转(常数矢量和v)
{
//把代码放在这一行下面。不要更改上面的任何内容。
矢量结果;
int size=3;
用于(自动i=0;i
我所有的老师都上传教科书页面,解释代码的某些部分应该做什么,但是教科书页面在试图找出如何实际应用这些东西方面没有提供任何帮助


有人能给我一些提示吗?

因为你知道你有多少个元素,而且它是最小的数字,可以旋转,你不需要做任何花哨的事情-只需按你需要的顺序放置项目,然后返回结果:

vector<int> rotate3(const vector<int>& x) {
    return vector<int> { x[1], x[2], x[0] };
}

由于您确切地知道有多少个元素,并且旋转是有意义的最小数,因此您不需要做任何花哨的事情-只需按您需要的顺序放置项目,然后返回结果:

vector<int> rotate3(const vector<int>& x) {
    return vector<int> { x[1], x[2], x[0] };
}

首先,请注意,您已将v作为常量引用(
const vector&
)传递,因此禁止您在
v.at(i)=v.at(i+1)中修改v的状态

尽管Sergey已经回答了一个直截了当的解决方案,但您可以这样更正代码:

#include <vector>
using namespace std;

vector<int> left_rotate(const vector<int>& v)
{
   vector<int> result;
   int size = v.size(); // this way you are able to rotate vectors of any size
   for (auto i = 1; i < size; ++i)
       result.push_back(v.at(i));

   // adding first element of v at end of result
   result.push_back(v.front());
   return result;
}
#包括
使用名称空间std;
向量左旋转(常量向量和v)
{
矢量结果;
int size=v.size();//这样可以旋转任意大小的向量
用于(自动i=1;i
首先,请注意,您已将v作为常量引用(
常量向量&
)传递,因此禁止您修改
v.at(i)=v.at(i+1)中v的状态

尽管Sergey已经回答了一个直截了当的解决方案,但您可以这样更正代码:

#include <vector>
using namespace std;

vector<int> left_rotate(const vector<int>& v)
{
   vector<int> result;
   int size = v.size(); // this way you are able to rotate vectors of any size
   for (auto i = 1; i < size; ++i)
       result.push_back(v.at(i));

   // adding first element of v at end of result
   result.push_back(v.front());
   return result;
}
#包括
使用名称空间std;
向量左旋转(常量向量和v)
{
矢量结果;
int size=v.size();//这样可以旋转任意大小的向量
用于(自动i=1;i
使用谢尔盖的答案。这个答案涉及为什么提问者的尝试不起作用。它们非常接近,所以值得一试,解释问题,并展示如何解决问题

v
const
ant。你不能给它写信。天真的解决方案(这行不通)是去掉中间人,直接写入
结果
向量
,因为它不是
常量

result.at(i) = v.at(i + 1);
这不起作用,因为

   vector<int> result;
结果代码

向量旋转(常量向量&v)
{
//把代码放在这一行下面。不要更改上面的任何内容。
向量结果(v.size());//在此处更改以调整向量大小
int size=3;
用于(自动i=0;i
几乎奏效了。但是当我们在{1,2,3}
result
上运行它时,它会在最后保存{2,3,0}。我们输了。这是因为
v.at(i+1)
从未触及
v
的第一个元素。我们可以增加for循环迭代的次数并使用模运算符

向量旋转(常量向量&v)
{
//把代码放在这一行下面。不要更改上面的任何内容。
向量结果(v.size());
int size=3;
for(auto i=0;i
现在输出是{2,3,1}。但是,只做我们正在做的事情,并在循环后附加缺少的元素,同样容易,而且可能要快一点

向量旋转(常量向量&v)
{
//把代码放在这一行下面。不要更改上面的任何内容。
向量结果(v.size());
int size=3;
用于(自动i=0;i
更进一步地说,3的大小对于这个函数来说是一个不必要的限制,我将消除它,因为我们保证在for循环中永远不会超出界限,所以我们不需要在
at

向量旋转(常量向量&v)
{
//把代码放在这一行下面。不要更改上面的任何内容。
if(v.empty())//无需旋转。
{
返回向量{};//返回空结果
}
向量结果(v.size());
对于(size\u t i=0;ivector<int> result(v.size());
std::vector<int> rotate_1(const std::vector<int>& v)
{
   std::vector<int> result = v;
   std::rotate(result.begin(), result.begin() + 1, result.end());
   return result;
}