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
。