c++ - 比较 std::vector 大小时出错

标签 c++ vector dictionary

我遇到了一些使用标准 C++ 库元素映射和 vector 的简单代码的奇怪问题。

我有一个表示为 map<int, Edgelist> 的图表其中 Edgelist 定义为 vector<int> .我还有一个 match比较两个图并返回 true 的函数如果pattern包含在 subject 中.

该代码是更大应用程序的一部分,但出现此问题的最小编译示例如下:

#include <vector>
#include <iostream>
#include <map>

typedef int Vertex;
typedef std::vector<Vertex> EdgeList;
typedef std::map<Vertex, EdgeList> PatternGraph;
typedef std::vector<Vertex>::iterator EdgeListIter;
typedef std::map<Vertex, EdgeList>::iterator GraphIter;
const Vertex ROOT = 1;

bool match(PatternGraph &pattern, Vertex p_start,
           PatternGraph &subject, Vertex s_start)
{
  int num_p, num_s;
  num_p = pattern[p_start].size();
  num_s = subject[s_start].size();

  if (pattern[p_start].size() == 0)
    return true;
  if (subject[s_start].size() == 0)
    return false;
  if (pattern[p_start].size() != subject[s_start].size())
    return false;
  if (pattern[p_start].size() == 1) {
    Vertex pattern_child, subject_child;
    pattern_child = pattern[p_start][0];
    subject_child = subject[s_start][0];
    return match(pattern, pattern_child, subject, subject_child);
  } else {
    Vertex p1, p2, s1, s2;
    p1 = pattern[p_start][0];
    p2 = pattern[p_start][1];
    s1 = subject[s_start][0];
    s2 = subject[s_start][1];
    return ((match(pattern, p1, subject, s1) && match(pattern, p2, subject, s2)) ||
        (match(pattern, p2, subject, s1) && match(pattern, p1, subject, s2)));
  }
}

bool test_match()
{
  bool passed = true;
  std::cout << "Running Match Test...";
  PatternGraph p1, p2, p3;
  p1[1] = std::vector<int>(2,3);
  p1[2] = std::vector<int>(4,5);
  p1[3] = std::vector<int>();
  p1[4] = std::vector<int>();
  p1[5] = std::vector<int>();

  p2[1] = std::vector<int>(2,3);
  p2[2] = std::vector<int>(4,5);
  p2[3] = std::vector<int>();
  p2[4] = std::vector<int>();
  p2[5] = std::vector<int>();

  p3[1] = std::vector<int>(2);
  p3[2] = std::vector<int>(3,4);
  p3[3] = std::vector<int>();
  p3[4] = std::vector<int>();

  if (!match(p1, ROOT, p2, ROOT)) {
    std::cout << "P1 Does not Match P2 when it should" << std::endl;
    passed = false;
  } else if (match(p2, ROOT, p3, ROOT)) {
    std::cout << "P2 matches P3 when it shouldn't" << std::endl;
    passed = false;
  } else {
    std::cout << "Match Test Passed." << std::endl;
  }

  return passed;
}

int main(int argc, char *argv[])
{

  test_match();
  return 0;
}

输出是“运行匹配测试...P2 在不应该匹配 P3 的时候匹配” 我调试了这段代码,发现由于某种原因,当 match(p2, ROOT, p3, ROOT)正在调用,大小为 p2[1]p3[1]都等于 2 , 当 p2[1]应该等于 2p3[1]应该等于 1 .

我很困惑,感谢任何帮助。我使用的编译器是Apple的g++ 4.2.1

最佳答案

这将创建一个 vector ,其中 2 个元素初始化为 0:

p3[1] = std::vector<int>(2);

这将创建一个 vector ,其中一个元素初始化为 2:

p3[1] = std::vector<int>(1, 2);

关于c++ - 比较 std::vector 大小时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5873488/

相关文章:

c++ - std::vector<bool> - 特化中没有 data() 函数?

c++ - 使用::std::vector 创建数组

c++ - Visual C++ 2010 中的 STL 映射实现和线程安全

c++ - 帮助印地语编程

c++ - Windows XP 是否自动将数组初始化为零?

c++ - 用成员初始化成员

python 检查字典值是否由字符串列表组成

c++ - 用 “code=3221225477”实现程序退出堆栈

r - 需要计算 R 中向量中特定转换的数量

c# - 通过 COM 互操作将 C# 字典编码到 C++