Ошибка при сравнении размеров std :: vector - PullRequest
0 голосов
/ 03 мая 2011

У меня странная проблема с каким-то простым кодом, использующим стандартные элементы библиотеки C ++ map и 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] должен быть равен 2 и p3[1] должно быть равно 1.

Я в тупике, и любая помощь приветствуется. Я использую компилятор g ++ от Apple 4.2.1

1 Ответ

2 голосов
/ 03 мая 2011

Это создает вектор с 2 элементами, инициализированными в 0:

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

Это создает вектор с одним элементом, инициализированными в 2:

p3[1] = std::vector<int>(1, 2);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...