我正在处理一些二进制数据,这些数据存储在任意长的无符号整数数组中。我发现我有一些重复的数据,我希望在短期内忽略重复,并删除长期导致它们的任何错误。
我正在考虑在存储之前将每个数据集插入到地图中,但是只有在地图中找不到它才会开始。我最初的想法是有一个字符串映射,并使用memcpy作为锤子强制整数进入字符数组,然后将其复制到字符串中并存储字符串。这失败了,因为我的大量数据在相关数据的前面包含多个字节0
(又名NULL
),因此大部分非常真实的数据都被抛弃了。
我的下一次尝试计划为std::map<std::vector<unsigned char>,int>
,但我意识到我不知道地图插入功能是否有效。
这是否可行,即使不明智,还是有更好的方法来解决这个问题?
修改
所以有人说我没说清楚我在做什么,所以这里有一个更好的描述。
我正在努力生成最小生成树,因为我有许多树,其中包含我正在使用的实际结束节点。目标是选择具有最短长度并覆盖所有端节点的树,其中所选择的树彼此最多共享一个节点并且全部连接。我的做法是基于二元决策树,但做了一些改变,希望能够实现更大的并行性。
我没有采用二叉树方法,而是为每个数据集选择了无符号整数的位向量,其中位数为1表示包含相应的树。
例如,如果只有树0包含在5树数据集中,我将以
开头00001
从这里我可以生成:
00011
00101
01001
10001
然后可以并行处理这些中的每一个,因为它们都不相互依赖。我为所有单树(00010,00100等)执行此操作,并且我没有花时间正式证明它,能够生成范围(0,2 ^ n)中的所有值而且只有一次。
我开始注意到许多数据集的完成时间比我想象的要长得多,并且启用了调试输出以查看所有生成的结果,以及稍后确认我有多个进程的快速Perl脚本生成相同的输出。从那时起,我一直试图解决重复的来源,但收效甚微,我希望这能够很好地运行,让我验证生成的结果,有时候,等待3天不等。计算
答案 0 :(得分:14)
你不会遇到问题,因为std :: vector为你提供了“==”,“&lt;”和“&gt;”操作符:
http://en.cppreference.com/w/cpp/container/vector/operator_cmp
答案 1 :(得分:6)
std::map
中的requirements for being a key被std::vector
感到满意,所以是的,你可以这样做。听起来像一个很好的临时解决方案(易于编码,最简单的麻烦) - 但你知道他们说什么:“没有什么比临时解决方案更永久了。”
答案 2 :(得分:2)
这应该有效,正如Renan Greinert指出的那样,vector<>
符合要求用作map
密钥的要求。
你也说:
我正在考虑在存储之前将每个数据集插入到地图中, 但只有在地图中找不到它才会开始。
这通常不是你想要做的,因为那将涉及在地图上执行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
}
答案 3 :(得分:0)
为什么你需要std::map
?也许我会错过一些观点,但是如果将std::vector
和find
算法一起使用作为示例here呢?
这意味着,您将unsigned int
附加到向量,然后搜索它,例如
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));
}
}