如果我在向量上使用.reserve(items),向量将分配足够的内存来猜测我需要的项目数.
如果我以后使用.clear(),那么只清除向量还是保存我之前定义的保留?
谢谢.
当我clear()
在a上使用std::vector
它时,它应该销毁它中的所有元素vector
,而不是它.
示例代码:
vector<double> temp1(4);
cout << temp1.size() << std::endl;
temp1.clear();
cout << temp1.size() << std::endl;
temp1[2] = 343.5; // I should get segmentation fault here ....
cout << "Printing..... " << temp1[2] << endl;
cout << temp1.size() << std::endl;
Run Code Online (Sandbox Code Playgroud)
现在,我应该在尝试访问已清除的向量时遇到分段错误,但是它会填充那里的值(据我说这是非常错误的)
结果如下:
4
0
Printing..... 343.5
0
Run Code Online (Sandbox Code Playgroud)
这是正常的吗?这是一个非常难以发现的错误,它基本上杀了我的代码数月.
调用clear()
向量将调用存储在向量中的任何内容的析构函数,这是一个线性时间操作.但是,当向量包含原始类型如int
或double
?
我开始比较:
但后来我注意到即使在push_back()
deque上似乎也更快.我必须做一些错误的,我不能相信一个更一般的容器也不太可能超过一个特定的一个.
我使用谷歌基准测试的代码:
#include "benchmark/benchmark.h"
#include <deque>
#include <vector>
#define NUM_INS 1000
static void BM_InsertVector(benchmark::State& state) {
std::vector<int> v;
v.reserve(NUM_INS);
while (state.KeepRunning()) {
state.PauseTiming();
v.clear();
state.ResumeTiming();
for (size_t i = 0; i < NUM_INS; i++)
v.push_back(i);
}
}
BENCHMARK(BM_InsertVector);
static void BM_InsertDeque(benchmark::State& state) {
std::deque<int> v;
while (state.KeepRunning()) {
state.PauseTiming();
v.clear();
state.ResumeTiming();
for (size_t i = 0; i < NUM_INS; i++)
v.push_back(i);
}
}
BENCHMARK(BM_InsertDeque);
BENCHMARK_MAIN();
Run Code Online (Sandbox Code Playgroud)
结果:
Run on (1 X 2592 MHz …
Run Code Online (Sandbox Code Playgroud) Cppreference只说:
从容器中删除指定的元素.1)删除pos处的元素.2)删除范围内的元素[first; 持续).
在擦除点或之后使迭代器和引用无效,包括end()迭代器.
迭代器pos必须是有效且可解除引用的.因此,end()迭代器(有效但不可解除引用)不能用作pos的值.
如果first == last,迭代器首先不需要是可解除引用的:擦除空范围是无操作.
有没有办法std::vector
在保留内存分配的同时清除内容?
这样做的原因是我有一段代码循环,我希望优化它。我目前将数据存储在std::vector
s 中。每次循环开始时,应清除向量的内容。然后我使用push_back
将数据输入到向量中,但是由于向量的长度在循环的迭代之间通常不会改变,我理想情况下希望向量将其分配的存储保留在内存中。
如果这是不可能的,vector
是否可以使用另一种快速访问 STD 类型?