Skip to content
On this page

d65_q2b_some_move.cpp

cpp
#pragma region student.h
#ifndef __STUDENT_H_
#define __STUDENT_H_

#include <algorithm>
#include <iostream>
#include <vector>

template <typename T>
void CP::vector_some_move<T>::insert(int index, std::vector<T> &value) {
    int i = std::upper_bound(aux.begin(), aux.end(), index) - aux.begin();
    int idx = i > 0 ? index -= aux[i - 1] : index;

    mSize += value.size();
    mCap += value.size();
    std::vector<T> newVector;

    // Update aux
    aux.push_back(aux.back() + value.size());
    for (int k = aux.size() - 2; k > i; k--) {
        aux[k] = aux[k + 1] - (aux[k] - aux[k - 1]);
    }

    auto &mDataI = mData[i];

    // Get data range
    std::vector<T> newRange(value.cbegin(), value.cend());
    for (int k = idx; k < mDataI.size(); k++) {
        newRange.push_back(mDataI[k]);
    }

    // Apply data range to mData[i]

    for (int k = idx; k < mDataI.size(); k++) {
        mDataI[k] = newRange[k - idx];
    }

    // Apply data range to newVector
    for (int k = mDataI.size() - idx; k < newRange.size(); k++) {
        newVector.push_back(newRange[k]);
    }

    mData.insert(mData.cbegin() + i + 1, newVector);
}

#endif
#pragma endregion student.h

See on GitHub

Last Updated: 15/1/2567 13:25:21 (UTC+7)

Released under the MIT License