在达到最大值后擦除向量的第一个条目

Erasing the first entry of a vector, after the maximum is reached

我有一个向量,我在其中保存坐标。 我对每个坐标执行一系列计算,这就是为什么我对矢量大小有限制。 现在,当达到限制时,我清除向量。 我正在寻找一种方法,让我保留以前的值,只删除向量中的第一个值。

简化,类似这样(如果向量的最大大小为 4)。

vector<int> vec;
vec = {1,2,3,4}
vec.push_back(5);

vec = {2,3,4,5}

这可能吗?

我认为您应该将此行为作为 std::vector 包装器适当地封装在您自己的向量 class 中。您可以将最大容量作为参数传递给构造函数。您可以重新实现可能导致“溢出”的方法,同时为其他方法重用 std::vector 方法。

为了简化您为 push_back 案例假装实现的目标,使用函数和全局变量,您可以:

  • 检查最大容量,
  • 如果已经达到该容量,则将矢量内容向左旋转一个位置;然后简单地覆盖最后一个元素;
  • 否则做一个正常的push_back。

[Demo]

#include <algorithm>  // rotate
#include <iostream>  // cout
#include <vector>

const size_t max_capacity{4};

void push_back(std::vector<int>& v, int n)
{
    if (v.size() == max_capacity)
    {
        // Rotate 1 left
        std::rotate(std::begin(v), std::begin(v) + 1, std::end(v));
        v[v.size() - 1] = n;
    }
    else
    {
        v.push_back(n);
    }
}

int main() 
{
    std::vector<int> v{};
    for (auto i{1}; i < 9; i++)
    {
        push_back(v, i);

        for (auto&& n : v) { std::cout << n << " "; }
        std::cout << "\n";
    }
}

by @paddy, you can use std::deque 一样,如果您 .push_back(...) 新(最后一个)元素和 .pop_front() 第一个元素,这是保留 N 元素的最高效方法。

std::deque 为此类操作提供 O(1) 复杂性,不像 std::vector 提供 O(N) 复杂性。

Try it online!

#include <deque>
#include <iostream>

int main() {
    std::deque<int> d = {1, 2, 3, 4};
    for (size_t i = 5; i <= 9; ++i) {
        d.push_back(i);
        d.pop_front();

        // Print
        for (auto x: d)
            std::cout << x << " ";
        std::cout << std::endl;
    }
}

输出:

2 3 4 5 
3 4 5 6 
4 5 6 7 
5 6 7 8 
6 7 8 9