C++ 修剪连续的std容器

C++ 修剪连续的std容器,c++,pointers,containers,std,c++17,C++,Pointers,Containers,Std,C++17,假设我有一个类似于以下内容的容器: std::vector<int> numbers{1,2,3,4,5,6,7,8}; 这似乎保证了不会重新分配和删除所有不适合新大小的后续元素(在本例中,只有最后一个元素8) 在容器的开头有类似的方法吗?而且,只要我传递给resize的参数小于或等于容器的原始大小,该操作是否保证为O(1) std::vector不支持从前端高效移除元素,但boost::circular\u buffer支持: 在某种程度上,std::deque也支持这一点,但它

假设我有一个类似于以下内容的容器:

std::vector<int> numbers{1,2,3,4,5,6,7,8};
这似乎保证了不会重新分配和删除所有不适合新大小的后续元素(在本例中,只有最后一个元素8)


在容器的开头有类似的方法吗?而且,只要我传递给resize的参数小于或等于容器的原始大小,该操作是否保证为O(1)

std::vector
不支持从前端高效移除元素,但
boost::circular\u buffer
支持:


在某种程度上,
std::deque
也支持这一点,但它也存在一些问题,例如常见的实现一次只分配少量内存,这意味着它分配内存的次数可能比
circular\u buffer
多。从
std::deque
中删除许多元素的速度并没有那么快,因为它必须释放许多块(而
circular\u buffer
只是增加一个整数值)。

std::vector
不支持从前端高效删除元素,但
boost::circular\u buffer
可以:

在某种程度上,
std::deque
也支持这一点,但它也存在一些问题,例如常见的实现一次只分配少量内存,这意味着它分配内存的次数可能比
circular\u buffer
多。从
std::deque
中删除许多元素的速度并没有那么快,因为它必须释放许多块(而
circular\u buffer
只是增加一个整数值)

我能想到的一种非常有效地删除“8”的方法是:

numbers.resize(numbers.size()-2);
numbers.resize(numbers.size()-2);
假设这应该是
-1
,不,这不是你想要做的。您应该始终选择用于该工作的工具。在本例中,如果只想删除最后一个元素,则为:

numbers.pop_back();
numbers.erase(numbers.end() - n, numbers.end());
如果要删除最后的
n
元素(假设
n
我能想到的一种非常有效地删除“8”的方法是:

numbers.resize(numbers.size()-2);
numbers.resize(numbers.size()-2);
假设这应该是
-1
,不,这不是您想要做的。您应该始终选择用于作业的工具。在这种情况下,如果您只想删除最后一个元素,那就是:

numbers.pop_back();
numbers.erase(numbers.end() - n, numbers.end());

如果要删除最后一个
n
元素(假设
n从
std::vector的开头(或非结尾的任何地方)删除元素,则需要复制剩余的/后面的元素。
numbers.resize(numbers.size()-2);
将删除最后两个元素,而不仅仅是最后一个(虽然从后面删除元素不需要任何复制,因此这并不比只删除元素要好。)为什么需要“修剪”向量?如果需要在开头或结尾进行有效的插入/删除,请尝试从开头删除元素
std::vector
的(或不在末尾的任何位置)需要复制其余/以下元素。此外,
numbers.resize(numbers.size()-2);
将删除最后2个元素,而不仅仅是最后一个元素(虽然从后面删除元素不需要任何复制,因此这并不比只删除元素好。)为什么需要“修剪”向量?如果需要在开头或结尾进行有效的插入/删除,请尝试一下
std::deque