删除包含结构的向量的向量

时间:2018-04-16 20:01:28

标签: c++ dictionary hash hashmap destructor

c ++ noob here。 我正在创建一个有限的哈希映射,我将结构存储在向量中,在向量内。 即:

struct bucket{
    V value;
    std::time_t time;
};

std::vector<std::vector<bucket>> limmap;

template <typename K, typename V>
ece2400::limited_hash_map<K,V>::limited_hash_map::limited_hash_map(std::size_t num_buckets , std::size_t bucket_size){
    for(int i = 0; i < num_buckets; i++){
        std::vector<bucket> temp(bucket_size);
        limmap.push_back(temp);
    }
}
  1. 使用数组而不是向量会更好吗?
  2. 我将如何创建析构函数?
  3. 谢谢!

2 个答案:

答案 0 :(得分:2)

首先,我不知道函数标题是否正确,但考虑到你的问题,让我们假设它是并且它并不重要。

<强> 1。使用数组而不是向量会更好吗?

如果你的意思是C风格的数组,那么我建议你不要使用它们。它是C ++,使用标准库。当然,C风格的数组更快但更容易出错。另一方面,如果你的意思是std::array,那么答案是否定的(有点)。要创建std::array对象,描述数组将保持的元素数量的参数必须是编译时知道的(constexpr)。这可能不适用于您的函数,因为您可以这样调用它:

int bucket_size;
std::cin >> bucket_size; // value not known at compile-time

limited_hash_map(num_buckets, bucket_size);

坚持std::vector,你就没事了。)

<强> 2。我将如何创建析构函数?

你不需要。 bucket没有在构造函数中分配任何资源,因此您不需要释放任何内容。最终,矢量将被破坏,当他们这样做时,它们会破坏它们所拥有的所有对象,在你的bucket个对象中。由于他们不需要任何明确的析构函数,因此它们将被自动销毁,没有任何问题。

希望这会有所帮助:)

答案 1 :(得分:0)

  1. 几乎肯定没有。因为阵列必须是动态大小的,所以你将需要承担许多额外的内存管理职责来照顾动态分配的关注和馈送。其中至少必须遵守The Rule of Three or Five
  2. vector很好地照顾自己。只要V符合Zero,Three或Five规则,你就不需要在析构函数中做任何事情。这可能允许ece2400::limited_hash_map利用零规则。