C ++中的向量和映射

时间:2011-11-14 13:04:25

标签: c++ stl

我有一个向量A [9 3 6 9 3 6],每2个元素代表一个图的边缘,我想从这个向量创建邻接矩阵。

首先,我创建了唯一的向量A [3 6 9]以了解矩阵的大小

其次我创建一个矩阵并用0

填充它

第三,我将在A上运行循环以了解连接的边缘,我的问题是如何告诉C ++ A中的第一个元素实际上代表我的矩阵中的元素0,同样代表6代表1和9表示为3,这样当我构造我的邻接矩阵时,我知道0 1 2实际上代表3 6 9,我听说过使用地图但不知道如何在我的程序中构造它,因为我是C ++的新手。

2 个答案:

答案 0 :(得分:0)

您实际上是在尝试跟踪顶点的标签。如果每个顶点都有一个顺序分配的数字,您可以扫描新的顶点标签并在地图中插入相应的序列号,如下所示:

std::map<int, std::size_t> labels;  // "int" is the label type; could be anything!

std::size_t store_vertex_label(int v)
{
  std::map<int, std::size_t>::const_iterator const it = labels.find(v);

  if (it != labels.end()) return it->second;

  const std::size_t new_number = labels.size();
  labels.insert(std::make_pair(v, new_number);
  return new_number;
}

现在,当您处理输入时,您一次只读取一个标签标记v,将其发送到store_vertex_label(),然后返回相应的顺序顶点索引。

您的邻接矩阵的大小为labels.size()平方。

请注意,您的标签类型不必是整数,也可以是任何内容(例如字符串)。

答案 1 :(得分:0)

有几种方法:

  1. 您可以执行线性搜索以查找向量中元素的索引
  2. 您的矢量似乎已经排序,二进制搜索也可能
  3. 如果矢量中的元素未排序,则可以创建地图而不是矢量。使用键填充地图作为“向量中的值”Vs值作为插入的索引。
  4. 首先是最糟糕的解决方案。如果vector未排序,请使用3rd。如果要降低空间复杂度,请使用2nd。如果使用大尺寸和散列图,第3个也会很好。

相关问题