2016-12-21 6 views
1

Ich habe ein STL-Set mit speziellen String-Elementen, die nach einem benutzerdefinierten Prädikat geordnet sind. Jede Zeichenfolge verwendet ihre horizontale Position (nicht den Text), um sich selbst zu ordnen. Ich versuche, benachbarte Zeichenfolgen auf einer Linie zusammenzufassen, indem ich ein einzelnes Zeichenfolgenobjekt verwende, indem ich die Zeichenfolgen zusammenfasse, die Ende an Ende zusammenlaufen. Bis jetzt habe ich es geschafft, diese benachbarten Set-Elemente zu findenVerschmelzung benachbarter Einträge von einem std :: set

Ich muss durch diese std::set<type> kopieren nicht benachbarte Elemente und dann zusammen die angrenzenden Elemente mit dem angegebenen Prädikat (siehe Lambda unten) zusammenführen. Könnte mir jemand mit den Details helfen.

Dies ist die Menge, die Ordnungs Komparator ich einen Satz dieser speziellen VCDUText Elemente zu konstruieren (strings grundsätzlich mit einem X, Y und einig zusätzlichen Attributen Material). Der Komparator sortiert den Text grundsätzlich nach seinem Offset vom Bildschirm mit MAXCOL Spalten.

static const auto gPositionComp = 
    [](const VCDUText& lhs, const VCDUText& rhs) -> bool { 
     auto lhsPos = lhs.mY * MAXCOL + lhs.mX; 
     auto rhsPos = rhs.mY * MAXCOL + rhs.mX; 
     return lhsPos < rhsPos; 
    }; 

Die removedText wird unten initialisiert (nicht gezeigt). Der Ort, an dem ich Probleme habe, versucht irgendwie, Elemente von removedText zu tempResult zu kopieren, während gleichzeitig die angrenzenden Einträge zusammengeführt werden. Beachten Sie, dass alle Elemente benachbart sein können. In diesem Fall sollte das Ergebnis nur aus einem Element bestehen, das die zusammengeführten Strings enthält.

 std::set<VCDUText, decltype(gPositionComp)> removedText(gPositionComp); 
     // initialized here ... 

     //.... 
     // transform removed entries to spaces 
     std::set<VCDUText, decltype(gPositionComp)> tempResult (gPositionComp); 
     std::for_each(removedText.cbegin(), removedText.cend(), 
      [&tempResult](const VCDUText& rNext) { 
       tempResult.emplace(rNext.mText, WHITE, BIG_CHAR, NONE, rNext.mX, rNext.mY); 
      }); 

     auto adjIter = std::adjacent_find(tempResult.cbegin(), tempResult.cend(), 
      [](const VCDUText& lhs, const VCDUText& rhs){ 
       if (lhs.mX + lhs.mText.size() == rhs.mX) { 
        return true; 
       } 
       return false; 
      }); 

     std::set<VCDUText, decltype(gPositionComp)> temp1 (gPositionComp); 
     while (adjIter != tempResult.cend()) { 
      // HELP NEEDED HERE HOW DO I MERGE THE ADJACENT ELEMENTS 
     } 

Antwort

2

Etwas in dieser Richtung (nicht getestet, nicht einmal kompiliert):

if (removedText.empty()) return; 
std::set<VCDUText, decltype(gPositionComp)> tempResult(gPositionComp); 
auto current = removedText.cbegin(); 
VCDUText accum = *current++; 
while (current != removedText.end()) { 
    if (accum.mX + accum.mText.size() == current->mX) { 
    accum.mText += current->mText; 
    } else { 
    tempResult.emplace(accum.mText, WHITE, BIG_CHAR, NONE, accum.mX, accum.mY); 
    accum = *current; 
    } 
    ++current; 
} 
tempResult.emplace(accum.mText, WHITE, BIG_CHAR, NONE, accum.mX, accum.mY);