Эффективное смещение векторов - PullRequest
0 голосов
/ 12 сентября 2018

Каков наилучший способ для линейного смещения вектора с сохранением длины и установки пустых слотов в 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 ]

0 голосов
/ 12 сентября 2018

Вместо этого вы можете использовать std::move, так как это, вероятно, должно быть немного более "эффективным", чем std::rotate. Тем не менее, нужно позвонить std::fill.

Используйте это как

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

Также, если смещение или размер вектора вводятся извне программы, не забудьте добавить некоторые проверки безопасности (как в ответе Паоло ).

0 голосов
/ 12 сентября 2018

Я думаю, что можно ограничиться вызовом std :: copy следующим образом:

#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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...