代码之家  ›  专栏  ›  技术社区  ›  abdfahim

向量的有效移位

  •  0
  • abdfahim  · 技术社区  · 6 年前

    保持向量长度不变并将空槽设置为0的最佳线性移位方法是什么 valarray.shift(int n) 做。

    我可以想出一个天真的方法,只是想知道是否有一个更好的

    int shift = 2;
    std::vector<int> v = {1,2,3,4,5};
    std::rotate(v.begin(), v.end() - shift, v.end());
    std::fill(v.begin(), v.begin() + shift, 0);
    
    // Input: 1,2,3,4,5
    // Output: 0,0,1,2,3
    
    2 回复  |  直到 6 年前
        1
  •  4
  •   Some programmer dude    6 年前

    你可以用 std::move std::rotate . 还需要那个吗 std::fill 尽管打电话。

    像这样使用它

    std::move(begin(v), end(v) - shift, begin(v) + shift);
    std::fill(begin(v), begin(v) + shift, 0);
    

    另外,如果向量的移位或大小是从程序外部输入的,那么不要忘记添加一些安全检查(如 the answer by Paolo ).

        2
  •  2
  •   Paolo Irrera    6 年前

    #include <iostream>
    #include <vector>
    
    int main()
    {
        const size_t shift {2};
        const std::vector<int> inVec = {1,2,3,4,5};
        std::vector<int> outVec(inVec.size());
        if(inVec.size() - shift > 0)
        {
            const size_t start {inVec.size() - shift};
            std::copy(inVec.begin(), inVec.begin() + start, outVec.begin() + shift);
        }
        for(const auto& val : inVec)
        {
            std::cout << val << " ";
        }
        std::cout << std::endl;
        for(const auto& val : outVec)
        {
            std::cout << val << " ";
        }
        std::cout << std::endl;
    }