2016-09-24 1 views
1

** Bearbeiten: Der Standardkonstruktor verursacht das Problem nicht. Ich habe den Grund unten angegeben. Ich habe diese Frage geklärt und abgestimmt, um Entschuldigung für jeden, der durch diesen Posten für jetzt Chancen hat. **vector <pair <int, unordered_set <int> >> gibt Segmentierungsfehler beim Bereitstellen von Standardkonstruktorargument für Paar

Der Code, der nicht

funktioniert
int n = numCourses; 
vector<pair<int, unordered_set<int>>> graph(n, make_pair(0, unordered_set<int>())); // pair of how many edges go in, and set of its neighbors. 
// We have to find our leaves: 
bool leaf[n]; 
for(int i = 0; i < n; i++){ 
    leaf[i] = true; 
} 

for(auto p : prerequisites){ 
    graph[p.first].first++; 
    graph[p.first].second.insert(0); 
    leaf[p.second] = false; 
} 

vector<int> leaves; 
for(int i = 0; i < n; i++){ 
    if(leaf[i]) 
     leaves.push_back(i); 
} 

Ich versuche, eine DAG Graph zu konstruieren, die einige nette Eigenschaften. Ich wollte ein Standardkonstruktorargument in das Diagramm einfügen, indem ich make_pair verwende, um die rvalue-Definition in das zweite Argument des Graphen einzutragen. Das erste Argument ist die Größe des Vektors. Ich wollte einen rvalue übergeben, wo der erste Wert des Paares 0 ist, also weiß ich sicher, dass es 0 ist, wenn ich in graph[p.first].first++ inkrementiere.

Ich versuchte dies und wenn es zu graph[p.first].second.insert(0) kommt, wirft es einen segfault, aber ich bin nicht 100% sicher, warum es geschieht.

Der Code, der

int n = numCourses; 
vector<pair<int, unordered_set<int>>> graph(n); // NO MORE DEFAULT RVALUE 
// We have to find our leaves: 
bool leaf[n]; 
for(int i = 0; i < n; i++){ 
    leaf[i] = true; 
} 

for(auto p : prerequisites){ 
    graph[p.first].first++; 
    graph[p.first].second.insert(0); 
    leaf[p.second] = false; 
} 

vector<int> leaves; 
for(int i = 0; i < n; i++){ 
    if(leaf[i]) 
     leaves.push_back(i); // This causes a segfault if I don't change it. 
} 

So ist die Ausgabe auf der Linie nach graph[p.first].second.insert(0) richtig war tatsächlich funktioniert. Es war mein boolesches Array, das Probleme verursachte. Entschuldigung für die Verwirrung! Ich habe diesen Post markiert, um von den Mods gelöscht zu werden.

Vielen Dank!

EDIT: unten habe ich einige runnable Fälle hinzugefügt haben: segfault nicht dazu führt: https://ideone.com/EdmSva verursacht segfault: https://ideone.com/GHQfog

Es war aufgrund der boolean-Array außerhalb der Grenzen erreichbar. Ich hätte das aufgreifen sollen, aber Ich habe versucht, einige print-Anweisungen zu verwenden, um zu sehen, wo der segfault passiert ist. Es war in der Zeile nach und ich vermute, der Puffer zu stdout wurde nicht geleert, wenn segfault aufgetreten ist, also für die Zeile, bevor es auch nicht den Druck angezeigt hat. Ich werde print nicht benutzen, um meine Bugs nach Segfaults zu durchsuchen - hier habe ich eine wertvolle Lektion gelernt.

+0

Wer hat gerade den Tippfehler zum Thema title kommentiert - danke! Früh am Morgen und ich habe noch keinen Kaffee geholt, haha ​​:) – OneRaynyDay

+0

Was lässt dich denken, der zweite hat deine Worte "Undefiniertes Verhalten - ich weiß" als Tatsache? Der sortierte Vektor verwendet ein wertinitialisiertes Argument, wenn Sie kein Argument angeben. Für Sie bedeutet 0 und Leer-Set für jedes Paar. Wolltest du das nicht? Ein tatsächliches [minimales, ** vollständiges **, überprüfbares Beispiel] (https://stackoverflow.com/help/mcve), das kopiert/eingefügt/kompiliert werden kann, um Ihr Problem zu zeigen, würde einen langen Weg zu Ihrer Frage bringen. Dieses Nicht-Standard-VLA für "Blatt" tut dir keinen Gefallen, und wir können nur vermuten, was dein * wirkliches * Problem ist. Wäre es ich, würde ich das durch Valgrind schicken. – WhozCraig

+0

@WhozCraig Du hast Recht, ich entschuldige mich.Ich habe eine MVCE in den Fußnoten angegeben (obwohl es nicht mehr wichtig ist), und ich werde es in Zukunft tun. Ich habe einige Versuche unternommen, das Programm zu debuggen, und ich dachte, dies sei das Problem (obwohl ich mich sehr getäuscht habe). – OneRaynyDay

Antwort

2

Ja, Sie vermissen etwas - der segfault steht nicht mit der Initialisierung von in Verbindung, die genau so funktioniert, wie man es erwarten würde. Einfaches Beispiel überprüfen:

#include <iostream> 
#include <vector> 
#include <unordered_set> 
using namespace std; 

int main() { 
    // your code goes here 
    int n = 5; 
    vector<pair<int, unordered_set<int>>> graph(n, make_pair(0, unordered_set<int>())); 
    graph[0].first = 1; 
    graph[1].second.insert(5); 
    graph[1].second.insert(6); 
    for (auto&& p : graph) { 
     std::cout << p.first << " " << p.second.size() << std::endl; 
    } 
    return 0; 
} 

Ausgang (oder es laufen hier: https://ideone.com/kSVSnA):

1 0 
0 2 
0 0 
0 0 
0 0 

Etwas anderes ist falsch in einigen der undefinierten Verhalten und ausgelassen Bits im Code :)

+0

Ah okay - danke! Ich überprüfe die Ursache und bearbeite diese Frage. :) – OneRaynyDay

Verwandte Themen