Zamiana wszystkiego za jednym razem

0

Witam,

  Szukam funkcji, wskazówki, pomysłu na to w jaki sposób(najwydajniejszy, operacja w locie) zamienić w wiadomości wystąpienia z jakiejś tablicy(bądź mapy, vektora). Żeby nie robić string.replace("a","b").replace("c","d"); w takim wypadku funkcja replace musi się wykonać dwa razy. A co jak warunków jest więcej? Pętla i replace 200x? Sposób musi być na tyle wydajny żeby parsować wiadomości w locie.
1

Napisz dokładniej o co ci chodzi!
Może powinieneś poczytać o wyrażeniach regularnych.

0

Prosty algorytm dla liter - tablica lub hash mapa (unikod) reprezentująca funkcję stare_litery->nowe_litery i jedna pętla po wszystkich literach.

0

Dajmy na to, że mamy jakiś tekst

Lorem ipsum dolor sit amet, consectetur adipiscing elit. In et nibh diam. Cras semper tellus pellentesque leo faucibus elementum volutpat odio cursus. Praesent lacinia porta mi eget rhoncus. Sed vel arcu id ligula consequat iaculis vel eget erat. Fusce ultricies mattis nisl in elementum. Vivamus sodales, odio nec iaculis condimentum, odio odio adipiscing felis, sit amet blandit est felis ut lectus. Morbi eu orci sit amet mauris luctus vestibulum sit amet vel lorem. In hac habitasse platea dictumst. Donec non dignissim ante. Aliquam pretium, justo vel aliquet congue, odio nisi eleifend enim, et rhoncus ipsum odio eget neque. Lorem ipsum dolor sit amet, consectetur adipiscing elit. In hac habitasse platea dictumst. Sed tristique dui et sapien vulputate a hendrerit urna euismod. Curabitur auctor accumsan porttitor. Fusce velit sapien, malesuada quis malesuada et, viverra eget massa.

Jest to przykładowa wiadomość odbierana i przed wypisaniem na ekran, program powinien zamienić zdefiniowane wcześniej słowa na inne, np. "In" na "Dust", "vel" na "nec" itd... i chciałbym żeby to było wykonywane w miarę szybko, żeby wiadomość(a jest ich sporo) wyświetlana dla użytkownika nie była zbytnio opóźniana.

0

Czy aż tak trudno opisać cały problem?
To ty masz problem, więc po co mamy cię cisnąć jak wyschniętą cytrynę, w nadziei na soki z konkretów.
#jaki framework? C++ to trochę ogólne! Qt, gtk, .Net, WinApi, ...?
#jaki system
#w czym trzymasz dane wiadomości? Raczej nie w prostym string.

0

Staram się pisać w czystym C++ ale stosuje gdzieniegdzie Boost i Winapi, aplikacja dla systemów Windows, wiadomości są trzymane w tablicy charów. Próbowałem w ten sposób:

boost::iostreams::regex_filter filter1(boost::regex("Pierwsze"), "Drugie");
   boost::iostreams::regex_filter filter2(boost::regex("Trzecie"), "Dwa");

   boost::iostreams::filtering_ostream out;
   out.push(filter1);
   out.push(filter2);
   out.push(source);

Ale coś jest nie tak, część jest zamieniona a część doklejona. Główny problem to przeparsowanie wiadomości i zamiana zdefiniowanych wcześniej słów na inne przy tylko jednym przejściu przez tekst.

0

Zaznaczam, że moja wiadomość to czysta teoria i taka luźna myśl - zastanawiam się, czy wiadomości nie można by zapisać jako wektora słów i spróbować tutaj wspomóc się technologią CUDA. Ale to tak jak mówię, taka moja dygresja, bo mi się skojarzyło że jest coś takiego :D

0

Jeśli zastępujesz całe słowa i na dodatek jesteś tak niskopoziomowo, że operujesz na tablicy char to ja bym zrobił tak.
#Wpakować słowa do podmiany do hash_table
#Alokacja nowej tablicy o tym samym rozmiarze +jakiś zapas (słowa mogą być dłuższe)
#w trakcie kopiowania wiadomości robić to słowo po słowie, dla kolejnych słów liczyć hash i na tej podstawie wyszukiwać czy jest słowo do podmiany. Jeśli słowo pasuje to skopiować podmianę jeśli nie pasuje to kopiować normalnie.
Myślę, że wydajniej się raczej nie da. Najważniejsze, że jest sekwencyjne kopiowanie danych (zaliczysz minimalną liczbę cache miss), i wyszukiwanie podmiany jest maksymalnie szybkie (jeśli twój słownik podmian jest mały może nie warto się bawić w hash-owanie).

1 użytkowników online, w tym zalogowanych: 0, gości: 1