C++ C+中的向量和映射+;

C++ C+中的向量和映射+;,c++,stl,C++,Stl,我有一个向量a[9 3 6 9 3 6]每两个元素代表一个图的边,我想从这个向量创建邻接矩阵 首先,我创建了唯一向量A[3 6 9],以了解矩阵的大小 第二步,我创建一个矩阵并用0填充它 < P >第三我将在A上运行一个循环来知道什么边是连接的,我的问题是我如何告诉C++,在三中第一个元素实际上代表了矩阵中的元素0,同样的代表6的1和9表示3,这样当我构造邻接矩阵时,我知道0 1 2实际上代表3 6 9,我听说过使用地图,但不知道如何在我的程序中构造它,因为我对C++是新的。p> 您实际上是在尝

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

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

第二步,我创建一个矩阵并用0填充它


< P >第三我将在A上运行一个循环来知道什么边是连接的,我的问题是我如何告诉C++,在三中第一个元素实际上代表了矩阵中的元素0,同样的代表6的1和9表示3,这样当我构造邻接矩阵时,我知道0 1 2实际上代表3 6 9,我听说过使用地图,但不知道如何在我的程序中构造它,因为我对C++是新的。p> 您实际上是在尝试跟踪顶点的标签。如果每个顶点都有一个顺序指定的编号,则可以扫描新的顶点标签并在地图中插入相应的顺序编号,如下所示:

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;
}
std::地图标签;//“int”是标签类型;什么都可能!
标准::大小存储顶点标签(int v)
{
std::map::const_迭代器const it=labels.find(v);
如果(it!=labels.end())返回它->秒;
const std::size_t new_number=labels.size();
标签。插入(标准::制作配对(v,新编号);
返回新的_编号;
}
现在,当您处理输入时,您一次读取一个标签标记
v
,将其发送到
store\u vertex\u label()
,然后返回相应的顺序顶点索引

邻接矩阵的大小将为
labels.size()
squared

请注意,标签类型不必是整数,它可以是任何东西(例如字符串)。

有几种方法:

  • 可以进行线性搜索以查找向量中元素的索引
  • 您的向量似乎已排序,也可以进行二进制搜索
  • 如果向量中的元素未排序,则可以创建映射而不是向量。使用键作为“向量中的值”而不是值作为插入的索引填充映射

  • 第一个是最糟糕的解决方案。如果向量未排序,请使用第三个。如果希望降低空间复杂度,请使用第二个。如果使用较大的大小和哈希映射,则使用第三个也很好。

    抱歉,它应该是
    it->second
    --已修复!是的,因为如果(it!=…好的,我需要睡一觉!抱歉。我还有最后一个问题,如果我想保留我们在这个函数中创建的映射以供以后使用,是否可能?或者我应该创建另一个函数并将输出作为标签而不是大小?@mona:好的,是的,您应该在你需要它。如果你愿意,你可以通过引用将它传递给store函数,或者(gasp)如果你有一个非常小的程序,甚至可以使它成为全局的。