- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在一个程序中使用 c++ STL Map 和 Vector 类,其中我有一个将 vector 作为指向整数的键的映射。通常在 map 中搜索值时,如果未找到该值,myMap.find() 将返回 myMap.end()。
当我尝试使用 myVector.reserve(int) 在我的 vector 中预分配空间(以防止在我使用它们时不断调整大小)时,我的麻烦就来了。出于某种原因,在我的 map 中搜索一个我知道不存在的 vector 时,当我搜索的 vector 已分配空间时,将不会返回 myMap.end(),无论我是否实际填充该 vector (示例 1)。
但是,当 vector 不在 map 中时(示例 2),只需将对象插入我希望搜索的 vector 中即可为我提供正确的 myMap.end() 位置。
示例 1:
#include <map>
#include <vector>
#include <iostream>
using namespace std;
int main(){
vector<int> v, v1;
v.reserve(1);
v1.reserve(1);
v[0] = 1;
v1[0] = 2;
map<vector <int>, int> m;
m.insert(make_pair(v, 0));
cout << int(m.find(v1) == m.end());
}
返回 0
示例 2:
#include <map>
#include <vector>
#include <iostream>
using namespace std;
int main(){
vector<int> v, v1;
v.reserve(1);
v[0] = 1;
v1.push_back(5);
map<vector <int>, int> m;
m.insert(make_pair(v, 0));
cout << int(m.find(v1) == m.end());
}
返回 1
我希望能够在我的 vector 中保留一定量的空间,但似乎让 map 如图所示工作的唯一方法是即时插入元素并动态调整 vector 大小。这样对吗?有什么解决方法吗?谁能解释这种(明显的)异常
行为?
最佳答案
首先,这段代码并不像您想象的那样。 reserve() 不会调整大小()。
vector<int> v;
v.reserve(100);
v[0] = 1; //undefined
cout << v.size(); //prints 0
再编辑一下:我意识到这实际上是“预期的”行为,因为在第一种情况下,v 和 v1 都是空 vector ,因为 reserve 不影响 ==、<= 的语义等。一旦您了解 reserve 实际上除了将段错误变成令人困惑的行为之外什么都不做,这应该是有道理的。我建议永远不要使用保留,直到你证明它会产生性能差异(过早优化)。
我对 <= 和 => 的描述以及您在这里可能不需要的 map ,但将其留作引用,因为它仍然可能会影响您解决此问题的工作。
其次, map 不关心事物是否==。他们关心事物是否在两个方向上 <= - 这个词是“等价的”。例如
Foo foo1(1);
Foo foo2(2);
map<Foo, int> m;
m.insert(makepair(foo1, 1));
m.find(foo2) == m.end(); //will be true iff foo1 <= foo2 && foo2 <= foo1
//even if foo1 != foo2 or !(foo1 == foo2)
所以如果在某个类 Foo 中,if(foo1 <= foo2 && foo2 <= foo1) then somemap.insert(makepair(foo1, 1));即使 foo1 != foo2 或 !(foo1 == foo2),somemap.find(foo2) 也会找到 foo1。
其次, vector 上的 <= 运算符是什么?它不是在测试是否具有相同的大小和逐点 ==。我认为每个 vector 都是“等效的”,意思是 <= 在两个方向上,对于空 vector ,但我不确定 - 在任何情况下都要考虑这种行为,因为这就是问题所在。
关于c++ - 使用 std::vector 作为 std::map 的键在未找到和使用 reserve() 时不返回 end(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10254274/
这个问题在这里已经有了答案: Different ways of loading a file as an InputStream (6 个答案) 关闭 8 年前。 在我的 gradle java
给定一个 User 类: class User end 我想使用 .class_eval 定义一个新常量.所以: User.class_eval { AVOCADO = 'fruit' } 如果我尝试
这可能听起来很奇怪,但我正在开发一个需要查找 div 内的元素或 div 本身的插件。 脚本根据用户选择查找元素,但内容(包括标记)是可变的。因此脚本将按如下方式查找元素: $('.block').f
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 Improve th
我需要在按我自己的函数排序的对的多集中查找并删除一个值。显然, .find 总是将迭代器返回到末尾,而不是返回到搜索到的值。有小费吗?这是函数: struct cmp { bool operato
求助!我将如何通过遍历查看字符并计算有效字符出现之前的下划线数量来查找和删除前导下划线。以及从字符串末尾向后迭代以查找任何尾随下划线。 我可以使用下面的方法来删除下划线,但是如何迭代才能找到下划线。
如果你在 $(xml) 中有下面的 xml,你会变得懒惰: $(xml).find("animal").find("dog").find("beagle").text() 在 jQuery 中是否有类
你如何找到4个文件的交集? 我用了grep -Fx -f 1.txt 2.txt 3.txt 4.txt ,但它似乎只适用于 2 个文件。同样comm -12 1.txt 2.txt无法扩展为 4 个
我已经完成了标记的姿势估计并获得了 rvec 和 tvec 值。我不知道如何找到它的中心,因为我需要绘制一个需要中心值的圆柱体。 我该怎么做? 最佳答案 标记的 tvec 是标记从原点的平移 (x,y
我有一个任务,我需要找到 2 个单链接(单对单)列表的交集。我还必须为 2 个双向链接(双重 vs 双重)列表执行此操作: 对于单链表,我使用 mergeSort() 对两个列表进行排序,然后逐项比较
我是 R 的新手,我有一个 100x100 的方阵。我想找到这个矩阵的最大特征值。我试过了 is.indefinite(x) 但是它写 is.indefinite(x) : argument x is
您好,我是 svg 和 JavaScript 的新手,当鼠标位于 svg 上方时,我试图使一些 svg 元素弹出(通过缩放),反之亦然,当鼠标离开 svg 元素时。 我已经能够通过使用转换使 svg
我正在尝试为 scala 项目编写一个类,但在多个地方使用 class、def、while 等关键字出现此错误。 它发生在这样的地方: var continue = true while (conti
我有两个 pandas 数据框,它们只取自一列并将日期列设置为索引,所以现在我有两个 Series。我需要找到这些系列的相关性。 这里有几行来自dfd: index change 2018-
我正在尝试调整我的 Vagrantfile,因此如果它丢失,它会自动在项目根目录中创建一个文件夹。创建文件夹没问题,但我无法找到创建该文件夹的位置。 我发现此信息可在 Vagrant::Environ
我正在尝试在 jquery 中找到 Test3 的位置,请有人引导我走上正确的道路。 我需要jquery来显示5 Test7 Test2 Test6 Test5 Test3 Test8 谢谢 最佳
大家早上好 我有一个像这样的图像列表: 使用 jQuery 如何查找 ul#preload 中包含特定字符串(例如“green”)的所有图像 src 类似... var new_src = j
我正在开发一个修改 Excel 文件的应用程序。 如何找到任意行中最后使用的单元格? 示例:行号 => 5 中最后使用的单元格 最佳答案 要找到一行中的最后一个单元格,您需要 Range 的 End
我刚刚陷入 react native ,需要一些帮助才能在找到 token 时导航到 protected 屏幕。我应该在哪里寻找应用程序加载时的 token ?如何在不多次调用导航的情况下导航用户一次
非常奇怪...此页面是 protected 内容还是我不知道的内容?我尝试单击下一页 anchor 。 参见this page first. 我试图用这个来抓取元素 var buttonNext =
我是一名优秀的程序员,十分优秀!