Моделирование сети с вектором векторов - PullRequest
1 голос
/ 28 февраля 2010

Я пытаюсь смоделировать сеть, используя C ++. У меня есть структура под названием NetworkConnection:

struct NetworkConnection {
  int i, j, weight;
}

и у меня есть класс под названием Network

class Network {
  public:
    std::vector<NetworkConnection> connections_for(int i) {
      return connections[i];
    }
    void connect(int i, int j, int weight) {
      NetworkConnection connection;
      connection.i = i;
      connection.j = j;
      connection.weight = weight;
      connections[i].push_back(connection)
    }
  private:
    std::vector< std::vector<NetworkConnection> > connections;
}

Теперь моя проблема в том, что я получаю ошибки при вызове connections_for (i), в частности, в конструкторе копирования. Смущает, однако, что точные обстоятельства segfault варьируются между запусками приложения. Я попытался использовать вектор указателей и вектор векторов указателей, например, так:

std::vector< std::vector<NetworkConnection> * > connections;
std::vector< std::vector<NetworkConnection *> > connections;

с соответствующими настройками интерфейса, но это не решило проблему. Сейчас я не знаю, как это исправить.

Что я здесь не так делаю? Или в качестве альтернативы, как бы вы смоделировали сеть на C ++ с интерфейсом, аналогичным описанному выше?

Ответы [ 2 ]

2 голосов
/ 28 февраля 2010

Вы хотите использовать карту:

class Network {
  public:
    std::vector<NetworkConnection> connections_for(int i) {
      return connections[i];
    }
    void connect(int i, int j, int weight) {
      NetworkConnection connection;
      connection.i = i;
      connection.j = j;
      connection.weight = weight;
      connections[i].push_back(connection);
    }
  private:
    std::map<int, std::vector<NetworkConnection> > connections;
};

Возможно, вы даже захотите использовать карту карт:

class Network {
  public:
    std::map<int, NetworkConnection> &connections_for(int i) {
      return connections[i];
    }
    void connect(int i, int j, int weight) {
      NetworkConnection connection;
      connection.i = i;
      connection.j = j;
      connection.weight = weight;
      std::map<int, NetworkConnection> &map = connections_for(i);
      map[j] = connection;
    }
  private:
    std::map<int, std::map<int, NetworkConnection> > connections;
};
1 голос
/ 28 февраля 2010

проблема сбоя сегмента обычно возникает из-за неуместной или нулевой инициализации вектора. Вы определяете вектор как

vector<vector<xxx> > xx;

вы можете использовать xx.pushback для добавления нового элемента, но когда вы используете 'xx[i]', вам нужно убедиться, что в векторе есть хотя бы (i+1) элементов. Первоначально есть 0.

вам нужно инициализировать длину вашего вектора. например,

connections.resize(nNodes);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...