2017-01-03 4 views
0

Ich muss den Unterschied zwischen 2 Textstrings basierend auf der Position jedes Zeichens in jeder Zeichenfolge berechnen. Ich muss den entfernten und den eingefügten Text von einer Zeichenfolge zur nächsten kommen. So sollte zum Beispiel 'Caty' vs. 'Bat' anzeigen, dass 'C' in Position 1 entfernt wurde, 'Y' in Position 4 wurde entfernt und 'B' wurde in Position 1 und 2 Leerzeichen in Position 4 eingefügt.Position vergleicht zwei Strings

Ich habe Folgendes versucht, aber die Sequenzen sind nicht geordnet und Visual C++ zeigt dies in einem Popup-Dialog mit Iterator-Debugging aktiviert. Ich könnte sie vor der Anwendung der Set-Differenz-Operationen sortieren, aber das wäre nicht das, wonach ich suche. Im Idealfall würde Ich mag diese mit einfachen std :: strings vs. Vektoren von Zeichen zu tun, aber ich vermute, dass ich entweder Vektoren von Zeichen oder std :: vector muß hängen bleiben>

std::vector<char> cat = {'C', 'a', 't', 'y'}; 
std::vector<char> bat = {'B', 'a', 't', ' ', ' '}; 
std::vector<char> removed; 
std::set_difference(
    bat.begin(), bat.end(), 
    cat.begin(), cat.end(), 
    std::back_inserter(removed)); 
std::cout << removed << std::endl; 
std::vector<char> inserted; 
std::set_difference(
    bat.begin(), bat.end(), 
    cat.begin(), cat.end(), 
    std::back_inserter(inserted)); 
std::cout << inserted << std::endl; 

Next ich schon versucht, diese - Das hat funktioniert - aber es zwingt mich, Sets zu verwenden, die wie Overkill erscheinen - es muss einen einfacheren Weg geben, etwas ähnliches mit Strings zu tun.

std::set<std::pair<int, char>> cat = {{0, 'C'}, {1, 'a'}, {2, 't'}, {3, 'y'}}; 
std::set<std::pair<int, char>> bat = {{0, 'B'}, {1, 'a'}, {2, 't'}, {3, ' '}, {4, ' '}}; 
std::set<std::pair<int, char>> removed; 
std::set_difference(
    cat.begin(), cat.end(), 
    bat.begin(), bat.end(), 
    std::inserter(removed, removed.end())); 
//std::cout << removed << std::endl; 
std::set<std::pair<int, char>> inserted; 
std::set_difference(
    bat.begin(), bat.end(), 
    cat.begin(), cat.end(), 
    std::inserter(inserted, inserted.end())); 
//std::cout << inserted << std::endl; 
+1

irgendeinem Grund nicht 'std :: string' verwenden? –

+0

@ThomasMatthews Ich möchte jedoch die Anwendung der Set-Operationen auf die Zeichenfolgen gibt keine positionsbasierten Unterschiede – johnco3

+1

http://stackoverflow.com/questions/805626/diff-algorithm, http://stackoverflow.com/questions/15303631/ Was-sind-einige-Algorithmen-zum-Vergleich-wie-ähnlich-zwei-Zeichenfolgen-sind –

Antwort

0

dies von Nutzen sein kann:

std::vector<std::pair<unsigned,char>> string_diff(const std::string& stra,const std::string& strb) { 
    unsigned p = 1; 
    std::vector<std::pair<unsigned,char>> ret; 
    std::for_each(stra.begin(), stra.end(),[&](const char l) { 
     if(strb.find(l) == std::string::npos) { 
      ret.push_back(std::make_pair(p,l)); 
     } 
     p++; 
    }); 

    return ret; 
} 

std::string cat = "caty"; 
std::string bat = "bat "; 

auto removed = string_diff(cat,bat); 
print(removed); 

auto inserted = string_diff(bat,cat); 
print(inserted); 
Verwandte Themen