动态向量的期望内容

Expected content of a dynamic vector

本文关键字:期望 向量 动态      更新时间:2023-10-16

我必须存储映射到其他整数的整数值。一种方法是使用std::map m。但是然后使用m[int]或m.find(int)来检索值,将是logN (N是元素数)的一个数量级。在我的例子中,N相当大(可达2^30)。我认为使用std::vector将更快地访问,因为每个键现在映射到向量元素的索引,可以在O(1)时间内访问。键是以随机顺序遇到的,它们可能不是连续的。例如,如果向量的大小为10,那么不是所有10个元素都是有效的,只有6个有效元素,其余的我需要用-1填充。我写了一个小程序,我惊讶地发现下面的输出:

int main () {
   std::vector<int> v;
   v.assign(6, -1); 
   v[3] = 10; 
   v[10] = 100;
   cout << v.size() << v.capacity() << endl ;
   cout << v[3] << v[10] << endl; 
}

看到的输出是size = 6, capacity = 6, V[3] = 10, V[10] = 100。我不明白为什么大小和容量是6,但是v[10]有一个有效值或者我没有遇到segg。的错。有人能解释一下吗?我的理解是push_back函数在矢量时动态调整矢量的大小。Size> vector。容量,操作符[]也这样做吗?为了安全起见,我将上面的代码重写为:

int main () {
   std::vector<int> v;
   v.assign(6, -1);
   int key = getKey(); 
   if (key < v.size()) 
      v[key] = <correct value>;
   else {
      v.resize(key, -1); // I want to assign -1 to invalid elements
      v[key-1] =  <correct value>;
   }
}

它似乎工作得很好,但是将key与v.p ower()进行比较,然后调整向量的大小会更好吗?

我的理解是push_back函数动态地调整向量的大小当向量。Size> vector。容量,操作符[]也这样做吗?

不,它没有。如果您使用operator[]访问vector的末尾,则代码的行为是未定义的。你必须显式地调整向量的大小,以确保它足够大,可以通过operator[]进行任何访问。

std::vector::at()类似于operator[],但是执行错误检查,因此可能有助于发现越界访问(但是执行这些额外的检查将会有性能成本)。

如果您希望您的数据结构相对稀疏,那么考虑std::unordered_map可能是值得的。

在任何情况下,我希望你意识到2^30 int将占用相当数量的RAM(如果int是32位宽,则为4GB)。即使您的硬件/操作系统允许您拥有这么大的数组,您也可能必须预先分配它,而不是通过反复重新分配来增加它。

std::vector<int> v;
v.assign(6, -1); 
v[3] = 10; 
v[10] = 100;  // Unlucky with this statement

vector的大小刚好是6。访问索引从0到5。您的第一个代码片段有未定义的行为,不幸的是,它在访问索引10时没有中断。如果存在键与值关联的概念,那么像std::mapstd::multimap这样的关联容器将比像std::vector这样的序列容器更好。