在达到最大值后擦除向量的第一个条目
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。
#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)
复杂性。
#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
我有一个向量,我在其中保存坐标。 我对每个坐标执行一系列计算,这就是为什么我对矢量大小有限制。 现在,当达到限制时,我清除向量。 我正在寻找一种方法,让我保留以前的值,只删除向量中的第一个值。
简化,类似这样(如果向量的最大大小为 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。
#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";
}
}
与 .push_back(...)
新(最后一个)元素和 .pop_front()
第一个元素,这是保留 N
元素的最高效方法。
std::deque
为此类操作提供 O(1)
复杂性,不像 std::vector
提供 O(N)
复杂性。
#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