jth*_*cie 13 c++ search stl vector map
我正在处理一些二进制数据,这些数据存储在任意长的无符号整数数组中.我发现我有一些重复的数据,我希望在短期内忽略重复,并删除长期导致它们的任何错误.
我正在考虑在存储之前将每个数据集插入到地图中,但只有在地图中找不到它才会开始.我最初的想法是有一个字符串映射,并使用memcpy作为锤子强制整数进入字符数组,然后将其复制到字符串中并存储字符串.这失败了,因为我的大量数据在相关数据的前面包含多个字节0(又名NULL),因此大部分非常真实的数据都被抛弃了.
我计划下一次尝试std::map<std::vector<unsigned char>,int>,但我意识到我不知道地图插入功能是否有效.
这是可行的,即使不明智,还是有更好的方法来解决这个问题?
编辑
所以有人说我没有弄清楚我在做什么,所以这里有一个更好的描述.
我正在努力生成最小生成树,因为我有许多树包含我正在使用的实际端节点.目标是选择具有最短长度并覆盖所有端节点的树,其中所选择的树彼此最多共享一个节点并且全部连接.我的做法是基于二元决策树,但做了一些改进,希望能够实现更大的并行性.
我没有采用二叉树方法,而是为每个数据集选择了无符号整数的位向量,其中位数为1的1表示包含相应的树.
例如,如果只是树0包含在5树数据集中,我就会开始
00001
从这里我可以生成:
00011
00101
01001
10001
然后可以并行处理这些中的每一个,因为它们中没有一个彼此依赖.我这样做对所有的单树(00010,00100,等),并应,我还没有花时间去正式证明这一点,才能够产生范围内的所有值(0.2 ^ N)的一次而且只有一次.
我开始注意到许多数据集的完成时间比我想象的要长得多,并且启用了调试输出以查看所有生成的结果,并且稍后我确认了一个快速的Perl脚本,我有多个进程生成相同的输出.从那以后,我一直在试图解决在重复从非常小的成功来了,我希望这将很好地工作,足以让我验证是否在没有产生结果,有时,第3天等待计算.
Ren*_*ert 15
你不会遇到问题,因为std :: vector为你提供了"==","<"和">"运算符:
http://en.cppreference.com/w/cpp/container/vector/operator_cmp
正如 Renan Greinert 指出的那样,这应该vector<>可以满足用作密钥的要求map。
你还说:
我正在考虑在存储每个数据集之前将其插入到地图中,但前提是在地图中没有找到它。
这通常不是您想要做的,因为这将涉及find()在地图上执行 a,如果没有找到,则执行操作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
}
Run Code Online (Sandbox Code Playgroud)