通过大于矢量大小的值旋转矢量元素?

时间:2017-01-04 17:10:54

标签: c++ stl rotation

有点简单的问题,我使用std :: rotate来旋转向量中元素的顺序:

getInitialView = () => {
  firebase.auth().onAuthStateChanged((user) => {
    let initialView = user ? "Home" : "Login";
    this.setState({
      userLoaded: true,
      initialView: initialView
    })
  });
}

我遇到了一个分段错误,其中K是> = V.size(),我很难理解:1)为什么会出现这个错误? 2)如何用这样的K值进行旋转操作?

例如,K为6应输出{2,3,4,1}

2 个答案:

答案 0 :(得分:5)

如果K大于V.size(),则V.rbegin()+K是无效的迭代器。你需要通过mod大小来减少K.类似的东西:

if (V.size() != 0) {
    std::rotate(V.rbegin(), V.rbegin() + (K % V.size()), V.rend());
}

首先注意size != 0的测试 - 否则你会被零除。

答案 1 :(得分:1)

V.rebegin() + 6不是有效的迭代器。它指向哪个元素?我假设您想要通过K个元素旋转矢量。你需要做的是应用模运算符来找出向量前面的值。

std::vector<int> V {1,2,3,4};
const auto K = 4 % V.size();
std::rotate(V.rbegin(), V.rbegin() + K, V.rend());

我不确定为什么你认为6的K应该导致{2,3,4,1},它给出{3,4,1,2}。也许我误解了这个问题。

修改:请先查看this answer有关检查尺寸的信息。