2016-04-06 5 views
0

Ich versuche derzeit, eine Zeichenfolge durch die Nummer 2 zu trennen und die Sub-Zeichen, die ich in einen 2D-Vektor, das Problem ist, dass jedes Mal, wenn ich versuche, bekomme ich eine Segmentierung Fehler, wenn ich Versuchen Sie, die zweite Reihe von Zeichen in den Vektor zu schieben. Nachdem ich einige Dinge versucht habe, denke ich, dass das Problem in dem Vektor "einige" liegt, nachdem ich den Inhalt des Vektors gelöscht habe. Es scheint mir, dass ich nach dem Clearing nicht mehr in der Lage bin, Werte in den Vektor zu pushen. Ich hoffe, dass jemand irgendwelche Vorschläge hat, weil ich feststecke.pushing strings in multidimensionalen Vektor C++

std::string str = "11121112111"; 
std::vector<int> some; 
std::vector<std::vector<int> > somemore; 
for (unsigned int i = 0; i < str.length(); i++) 
{ 
    if (str[i] == '2') 
    { 
     somemore.push_back(some); 
     some.clear(); 
    } 
    else 
    { 
     some.push_back(1); 
    } 
} 
for (unsigned int i = 0; i <= 3; i++) 
{ 
    for (unsigned int j = 0; j <= 3; j++) 
    { 
     std::cout << somemore[i][j] << std::endl; 
    } 
} 
+2

Dies kann nicht Ihr tatsächlicher Code sein. Ihre Variablennamen stimmen nicht mit Ihren Deklarationen überein. Bitte stellen Sie eine [mcve] bereit und Sie sollten den Code zumindest mit einem Debugger durchgehen, um herauszufinden, wann der Code tatsächlich default ist. – NathanOliver

+0

Tut mir leid, habe vergessen, dass ich "Som" zu "Som" und "Sommore" zu "Somemore" geändert habe, aber ich denke das ist nicht das Problem, da mein Problem ein anderes ist. Aber trotzdem danke – Erry07

+1

Sie haben zwei Probleme: Die erste ist, dass Sie nicht die letzte 'some' auf' somemore' schieben, weil es keine '2' am Ende von' str' gibt, die zweite ist, dass Ihre letzte Schleife sollte sei '<3', da dein letztes Array ein' 3x3' und kein '4x4' wäre. – Holt

Antwort

0

Ich würde den letzten Teil ändern:

for(unsigned int i = 0; i <=3; i++) 
{ 
    for(unsigned int j = 0; j <=3; j++) 
     { 
      std::cout << somemore[i][j] << std::endl; 
     } 
} 

In diesem:

for(unsigned int i = 0; i < somemore.size(); i++) 
{ 
    for(unsigned int j = 0; j < some.size(); j++) 
     { 
      std::cout << somemore[i][j] << std::endl; 
     } 
} 

Es ist viel sicherer.

+1

Dies wird fehlschlagen, da 'einige' am Ende leer ist, verwenden' somemore [i] .size() ', oder besser Iterator oder C++ 11 für jede Schleife verwenden. – Holt

0

In dieser Schleife

for(unsigned int i = 0; i < str.length(); i++) 
{ 
    if(str[i] == '2') 
    { 
     sommore.push_back(som); 
     som.clear(); 
    } 
    else 
    { 
     som.push_back(1); 
    } 
} 

, wo es nicht klar ist, ob som der Vektor wie

deklariert ist
std::vector<int> some; 
       ^^^^^ 

der letzte Teil der Zeichenfolge

std::string str = "11121112111"; 
          ^^^ 

wird von Vektor ignoriert sommore. Der Vektor enthält also nur zwei Elemente, die zwei 2 (s) in der Zeichenfolge entsprechen.

Als Folge diese Schleifen

for(unsigned int i = 0; i <=3; i++) 
    { 
     for(unsigned int j = 0; j <=3; j++) 
     { 
      std::cout << sommore[i][j] << std::endl; 
     } 
    } 

, die die magische Zahl verwenden 3 Verhalten nicht definiert haben.

Auch wenn der Vektor und seine Untervektoren 3 Elemente enthalten, sind auch in diesem Fall die Bedingungen i <=3 und j <=3 falsch.

Sie können die folgende Vorgehensweise in diesem demonstratrive Programm gezeigt nehmen

#include <iostream> 
#include <string> 
#include <vector> 

int main() 
{ 
    std::vector<std::vector<int>> v; 
    std::string str = "11121112111"; 

    for (std::string::size_type pos = 0; (pos = str.find_first_not_of("2", pos)) != std::string::npos;) 
    { 
     auto n = str.find("2", pos); 
     if (n == std::string::npos) n = str.size(); 
     v.push_back(std::vector<int>(n - pos, 1)); 
     pos = n; 
    } 

    for (const auto &row : v) 
    { 
     for (int x : row) std::cout << x; 
     std::cout << std::endl; 
    }   

}  

Die Programmausgabe ist

111 
111 
111 
0

Mit C++ 11 und Boost Sie eine viel elegantere Lösung machen können, ohne die Notwendigkeit für Schleifen mit einem inkrementierenden Index.

#include <vector> 
#include <string> 
#include <iostream> 
#include <boost/algorithm/string/split.hpp> 
#include <boost/algorithm/string/classification.hpp> 

int main() 
{ 
    std::string str = "11121112111"; 
    std::vector<std::string> string_vector; 
    boost::split(string_vector, str, boost::is_any_of("2")); 

    std::vector<std::vector<int>> int_vector; 

    for (auto& s : string_vector) 
     int_vector.push_back(std::vector<int>(s.size(), 1)); 

    for (auto& v : int_vector) 
     for (auto& i : v) 
      std::cout << i << std::endl; 

    return 0; 
} 
+1

Wäre noch besser, wenn Sie 'int_vector.push_back (std :: vector (s.size(), 1));'. – Holt

+0

@Holt. Großer Vorschlag. Ich wusste nicht, dass das so möglich war. – Chiel

0

Wie ich bereits in den Kommentaren erwähnt, haben Sie zwei Probleme im Code:

  1. Sie sind nicht die letzte some in somemore drängen, weil es keine 2 am Ende str ist.
  2. Ihre letzten Schleifen sind zu groß - Sie haben eine 3x3 Matrix, aber Sie erwarten eine 4x4 seit Sie von 0 bis 3 gehen.

By the way, da Sie nur diejenigen zu zählen sind, brauchen Sie nicht some:

std::string str = "11121112111"; 
std::vector<std::vector<int>> somemore; 
size_t count = 0; 
for (size_t = 0; i < str.length(); i++) { 
    if (str[i] == '2') { 
     somemore.push_back(std::vector<int>(count, 1)); 
     count = 0; 
    } 
    else { 
     ++count; 
    } 
} 
for (size_t i = 0; i < somemore.size(); ++i) { 
    for (size_t j = 0; j < somemore[i].size(); ++j) { 
     std::cout << somemore[i][j] << std::endl; 
    } 
} 

Sie könnten auch die letzten beiden Schleifen mit Iteratoren ersetzen, oder wenn Sie c++11 zur Verfügung:

for (const auto &s: somemore) { 
    for (const auto &v: s) { 
     std::cout << v << std::endl; 
    } 
} 
Verwandte Themen