1 votes

Modélisation d'un réseau avec un vecteur de vecteurs

J'essaie de modéliser un réseau en utilisant C++. J'ai une structure appelée NetworkConnection :

struct NetworkConnection {
  int i, j, weight;
}

et j'ai une classe appelée 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;
}

Mon problème est que j'obtiens des erreurs de segmentation lorsque j'appelle connections_for(i), en particulier dans le constructeur de la copie. Cependant, les circonstances exactes de cette erreur varient d'une exécution à l'autre de l'application. J'ai essayé d'utiliser un vecteur de pointeurs et un vecteur de vecteurs de pointeurs comme suit :

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

avec les ajustements appropriés à l'interface mais cela n'a pas résolu le problème. Je ne sais pas comment résoudre ce problème.

Qu'est-ce que je fais de mal ici ? Ou alternativement, comment modéliser un réseau en C++ avec une interface similaire à celle ci-dessus ?

2voto

R Samuel Klatchko Points 44549

Vous voulez utiliser une carte :

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;
};

Vous pouvez même utiliser une carte des cartes :

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;
};

1voto

Yin Zhu Points 10438

Le problème de défaut de segment provient généralement d'une initialisation inappropriée ou inexistante d'un vecteur. vous définissez le vecteur comme suit

vector<vector<xxx> > xx;

vous pouvez utiliser xx.pushback pour ajouter un nouvel élément, mais lorsque vous utilisez la fonction 'xx[i]' vous devez vous assurer qu'il y a au moins (i+1) éléments du vecteur. Au départ, il y a 0 .

vous devez initialiser la longueur de votre vecteur, par exemple.

connections.resize(nNodes);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X