我对c ++ vector有疑问。我在vector(int)类型上测试 1000000 push_back ,并且仅在 4毫秒
中完成vector <int> Test;
auto start_t = chrono::high_resolution_clock::now();
for (int i = 0; i < 1000000; i++) Test.push_back(i);
cout << chrono::duration_cast<chrono::milliseconds>(chrono::high_resolution_clock::now() - start_t).count() << " milliseconds\n" << endl;
但如果我制作了自己的阵列引擎,即使我将分配设置为分配这样的大小(计数* 2)(每个分配时间),也需要大约3分钟来执行此操作
template <typename T>
class Array {
private:
T * storage_;
int alloc_ = 0;
int count_ = 0;
int all_ = 0;
public:
Array() = default;
~Array() { delete[] storage_; }
void Set(const T & __t) {
if(count_ + 1 >= alloc_) {
T * temp = new T[count_ * 2 + 4];
if(count_ > 0) for (int i = 0; i < count_; i++) temp[i] = storage_[i];
delete[] storage_;
storage_ = temp;
all_++;
}
storage_[count_++] = __t;
}
int all() { return all_; }
int count() { return count_; }
};
......这速度怎么可能?是缓存吗?因为我不相信它是一个c ++优化,因为在优化上做了什么,它不能像这样快速制作矢量...我认为它是完全缓存或其他检测我们有1000000次推回的东西所以分配1000000大小在开始和做过程......是真的还是别的什么?
答案 0 :(得分:2)
您的重新分配逻辑已损坏,因为它未设置alloc_
。因此它每次都重新分配。你的all_
成员毫无意义。看来你在某种程度上混淆了这两个变量。