Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 以向量为键的STL映射_C++_Search_Stl_Map_Vector - Fatal编程技术网

C++ 以向量为键的STL映射

C++ 以向量为键的STL映射,c++,search,stl,map,vector,C++,Search,Stl,Map,Vector,我正在处理一些二进制数据,这些数据存储在任意长的无符号整数数组中。我发现我有一些重复的数据,我希望在短期内忽略重复的数据,并在长期内消除导致重复的错误 我正在考虑在存储每个数据集之前将其插入到地图中,但前提是在地图中没有找到它。我最初的想法是拥有一个字符串映射,并使用memcpy作为锤子将int强制放入字符数组,然后将其复制到字符串中并存储该字符串。这失败了,因为我的大量数据在相关数据的前面包含多个字节的0(又称NULL),所以大部分非常真实的数据被抛出 我的下一次尝试计划是std::map,但

我正在处理一些二进制数据,这些数据存储在任意长的无符号整数数组中。我发现我有一些重复的数据,我希望在短期内忽略重复的数据,并在长期内消除导致重复的错误

我正在考虑在存储每个数据集之前将其插入到地图中,但前提是在地图中没有找到它。我最初的想法是拥有一个字符串映射,并使用memcpy作为锤子将int强制放入字符数组,然后将其复制到字符串中并存储该字符串。这失败了,因为我的大量数据在相关数据的前面包含多个字节的
0
(又称
NULL
),所以大部分非常真实的数据被抛出

我的下一次尝试计划是
std::map
,但我意识到我不知道map insert函数是否可以工作

这是可行的,即使是不明智的,还是有更好的方法来解决这个问题

编辑

所以有人说我没有说清楚我在做什么,所以这里有一个更好的描述

我正在生成一个最小生成树,因为我有很多树包含我正在处理的实际端点节点。目标是选择长度最短且覆盖所有端点节点的树,其中所选树彼此最多共享一个节点,并且所有节点都是连接的。我的方法基于一个二叉决策树,但做了一些修改,希望能够实现更大的并行性

我没有采用二叉树方法,而是为每个数据集从无符号整数中生成一个位向量,其中位位置的1表示包含相应的树

例如,如果5树数据集中只包含树0,我将从

00001

从这里我可以生成:

00011

00101

01001

10001

然后可以并行处理其中的每一个,因为它们都不相互依赖。我对所有的单株树(000100100等)都这样做,而且我还没有花时间正式证明它,我应该能够生成(0,2^n)范围内的所有值一次且仅一次


我开始注意到,许多数据集的完成时间比我认为的要长得多,并启用了调试输出来查看所有生成的结果,后来一个快速的Perl脚本确认我有多个进程生成相同的输出。从那以后,我一直在尝试解决复制品的来源问题,但几乎没有成功,我希望这能很好地让我验证生成的结果,有时不用等待3天的计算时间。

你不会有问题,因为std::vector为你提供了“==”操作员:


中的
std::map
满足
std::vector
,因此您可以这样做。听起来像是一个很好的临时解决方案(易于编码,麻烦最少)——但你知道他们说的:“没有什么比临时更持久的了。”

这应该是可行的,正如Renan Greinder指出的那样,
向量
满足用作
映射
键的要求

你还说:

我正在考虑在存储每个数据集之前将其插入到地图中, 但前提是在地图上找不到它

这通常不是您想要做的,因为这需要在地图上执行
find()
,如果找不到,则执行
insert()
操作。这两个操作基本上需要进行两次查找。最好尝试将项目插入地图。如果密钥已经存在,根据定义,操作将失败。因此,您的代码如下所示:

#include <vector>
#include <map>
#include <utility>

// typedefs help a lot to shorten the verbose C++ code
typedef std::map<std::vector<unsigned char>, int> MyMapType;

std::vector<unsigned char> v = ...; // initialize this somehow
std::pair<MyMapType::iterator, bool> result = myMap.insert(std::make_pair(v, 42));
if (result.second)
{
   // the insertion worked and result.first points to the newly 
   // inserted pair
}
else
{
   // the insertion failed and result.first points to the pair that
   // was already in the map
}
#包括
#包括
#包括
//Type DEFS有助于缩短冗长的C++代码。
typedef std::map MyMapType;
标准::向量v=…;//以某种方式初始化它
std::pair result=myMap.insert(std::make_pair(v,42));
如果(结果秒)
{
//插入成功,结果.first指向新的
//插入对
}
其他的
{
//插入失败,结果为。第一个指向
//已经在地图上了
}

为什么需要
std::map
?也许我遗漏了一些要点,但是使用
std::vector
find
算法作为例子怎么样

这意味着您将
无符号int
s附加到向量,然后搜索它,例如

std::vector<unsigned int> collector; // vector that is substituting your std::map
for(unsigned int i=0; i<myInts.size(); ++i) {  // myInts are the long ints you have
    if(find(collector.begin(), collector.end(), myInts.at(i)==collector.end()) {
         collector.push_back(myInts.at(i));
    }
}
std::向量收集器;//替换std::map的向量

对于(unsigned int i=0;i您是否需要小于运算符作为映射中的键。我想您可以将比较作为模板参数提供。vector也提供了这一点,如链接中所示。我将编辑我的答案以使其更清晰。感谢您的观察。是什么阻止您尝试此操作?如果您只需要唯一性,您可以考虑<代码> STD::设置< /代码>。我真正希望看到的是,如果在添加了这个之后,我仍然得到重复的结果。这会缩小搜索范围,使我无意地存储或获取副本,而不是生成它们。如果我能把所有东西都装在一个未签名的int中,那就很好了。问题是一旦我得到了足够的。大量输入我必须开始溢出到多个整数中,并且必须将它们作为整个集合保存以供搜索。我真的希望这样做,而不是实际制作一个结构来处理这个问题,因为这可能是一个非常临时的黑客行为。我更新了原始问题,更详细地介绍了我正在做的事情,希望这样这有助于理清我的动机。老实说,我没有意识到可以像这样跳过这个发现,感谢我在STL中使用的令人敬畏的新东西。哦,我刚刚修复了“密钥已经在m中”的注释