动态向量的期望内容
Expected content of a dynamic vector
我必须存储映射到其他整数的整数值。一种方法是使用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::map
或std::multimap
这样的关联容器将比像std::vector
这样的序列容器更好。
- 写入向量<向量<bool>>
- 函数向量_指针有不同的原型,我可以构建一个吗
- std::向量与传递值的动态数组
- 将值指定给向量(2D)的向量中的某个位置
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 如何使用向量的template_back函数
- 尝试通过多个向量访问变量时,向量下标超出范围
- 如何通过派生类函数更改基类中的向量
- C++从另一个类访问公共静态向量的正确方法是什么
- 如何将ampl中的集合表示为c++中的向量
- 变量没有改变?通过向量的函数调用
- 迭代时从向量和内存中删除对象
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 如何将子类作为函数的参数传递给期望基类,然后将该对象传递到指向这些抽象类对象的指针向量中?
- 如何初始化一个在C++中期望向量和变量的构造函数<int>?
- 将指针传递给期望为向量的函数
- 动态向量的期望内容
- 没有匹配的调用函数(期望3个参数,实际0个).第一次在c++中处理向量和字符串
- 如何通过引用返回一个向量,隐式期望一个空向量作为输入