矢量迭代自己

时间:2013-07-25 18:26:50

标签: c++ c

在我的项目中,我有一个带有一些关系数据的向量(一个包含两个相似对象的结构,表示它们之间的关系),我需要检查向量中所有数据之间的关系组合。

我正在做的是迭代向量并在第一个for循环内部我再次迭代以寻找数据之间的关系。

这是我正在做的事情的简化模型

for(a=0; a<vec.size(); a++)
{
    for(b=0; b<vec.size(); b++)
    {
        if(vec[a].something==vec[b].something) {...}
    }
}

我的收藏有2800个元素,这意味着我将迭代2800 * 2800次......

哪种数据结构更适合这种操作? 使用for_each会更快,然后像这样遍历矢量吗?

提前致谢!


vec有两个结构,由两个整数组成,没有任何顺序。

3 个答案:

答案 0 :(得分:4)

不,for_each仍然做同样的事情。

使用哈希映射可以使您的问题更好。从空哈希开始并遍历列表。对于每个元素,请查看它是否在哈希中。如果不是,请添加它。如果是,那么你有一个副本,你运行你的代码。

在C ++中,您可以使用std :: map。在C中,没有内置的地图数据结构,因此您必须自己制作。

高级伪代码看起来像这样

foreach (element in array)
  if map.has_key(element)
    do_stuff(element)
  else
    map.add_key(element)

答案 1 :(得分:2)

提高此操作效率的最简单方法是对矢量进行排序,然后查找重复项。如果排序向量不是一个选项,您可以创建另一个指向该向量元素的指针向量并对其进行排序。这两个将带您从N ** 2复杂度到N * log(N)复杂度(当然,假设您使用N * log(N)排序)。这确实意味着使用更多空间,但通常使用一点空间来显着改善时间是非常合理的。

答案 2 :(得分:0)

假设您的向量包含“关系”结构,如:

class Entity;

struct Relation {
  Entity* something;
  Entity* relative;
};

你有一个“关系”的载体:

std::vector<Relation> ties;

因此,如果我理解正确,您希望对关系进行细分,并为每个实体提供关系列表。这可以用地图表示:

std::map<Entity*,std::vector<Relation*>> entityTiesIndex;

然后你可以通过所有联系扫描一次并收集每个实体的关系:

for (int i=0; i < ties.size(); ++i ) {
  Relation* relation = &ties[i];
  entityTiesIndex[relation->something].push_back(relation);
}

请注意关于对容器元素的引用的通常免责声明,因为当容器被更改时这些可能会发生变化。

希望这是有道理的。

相关问题