Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > C/C++
You last visited: Today at 03:05

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



C++ String Problem

Discussion on C++ String Problem within the C/C++ forum part of the Coders Den category.

Reply
 
Old   #1
 
elite*gold: 0
Join Date: Apr 2009
Posts: 177
Received Thanks: 42
C++ String Problem

Ich stehe vor einem blöden problem,

wahrscheinlich ist die Lösung ziemlich simple aber habe keine Idee wie ich das umsetzen soll undzwar habe ich einen std::string mystring "000111110000110010111100" und ich möchte dazwischen / dahinter die length einfügen so das , dass wie folgt aussieht:

length 3 (000) length 5(11111) length 4 (0000) length 2(11) length 2 (00) length 1 (1) length 1 (0) length 4(1111) length 2(00) am ende sollte der string so aussehen:

300051111140000211200111041111200

Ich hoffe man versteht was ich anhand des beispiels meine.
BrendonHomo is offline  
Old 04/02/2012, 14:16   #2
 
xNopex's Avatar
 
elite*gold: 0
Join Date: May 2009
Posts: 827
Received Thanks: 471
Ich würde es ja rekursiv lösen:

Code:
#include <iostream>
#include <string>
#include <sstream>

std::string rekChStr(std::string str)
{
    char ch = str.at(0);
    int length = 1;
    while(length < str.size() && str.at(length) == ch)
    {
        length++;
    }
    std::string s(length, ch);
    std::stringstream toString;
    toString << length;

    if(str.size() == length)
    {
        return toString.str()+s;
    }else
    {
        return toString.str()+s+rekChStr(str.substr(length));
    }

}

int main()
{
    std::cout << rekChStr("000111110000110010111100");

    return 0;
}
xNopex is offline  
Thanks
1 User
Old 04/02/2012, 22:54   #3
 
link's Avatar
 
elite*gold: 1
Join Date: Jul 2005
Posts: 553
Received Thanks: 454
Sehe keinen Grund für Rekursion, wenn's sowieso so straightforwarded ist und die Rekursion ganz simpel den iterativen Ansatz ersetzt, da es in so einem Fall eigentlich nur langsamer werden kann:

Code:
#include <iostream>
#include <string>
#include <sstream>
#include <ctime>

std::string rekChStr(std::string str)
{
    char ch = str.at(0);
    int length = 1;
    while(length < str.size() && str.at(length) == ch)
    {
        length++;
    }
    std::string s(length, ch);
    std::stringstream toString;
    toString << length;

    if(str.size() == length)
    {
        return toString.str()+s;
    }else
    {
        return toString.str()+s+rekChStr(str.substr(length));
    }

}

std::string xyz(std::string str)
{
	int pos = 0;
	std::stringstream toString;

	do
	{
		char ch = str.at(pos);
		int length = 1;

		while (++pos < str.size() && str.at(pos) == ch)
			length++;

		std::string s(length, ch);
		toString << length;
		toString << s;

	} while (pos < str.size());

	return toString.str();
}

int main()
{
	int i, a = clock();

	for (i = 0; i < 1000; i++)
		rekChStr("000111110000110010111100");

    std::cout << rekChStr("000111110000110010111100") << std::endl << clock() - a << std::endl;

	a = clock();
	for (i = 0; i < 1000; i++)
		xyz("000111110000110010111100");

    std::cout << xyz("000111110000110010111100") << std::endl << clock() - a << std::endl;

	std::cin >> a;

    return 0;
}
Kenne mich mit C++ zwar nicht aus, aber es scheint schneller zu sein, wenn man den std::stringstream weiter benutzt anstatt einen neuen std::string zu erzeugen:
Code:
std::string rekChStr(std::string str)
{
    char ch = str.at(0);
    int length = 1;
    while(length < str.size() && str.at(length) == ch)
    {
        length++;
    }
    std::string s(length, ch);
	std::stringstream toString;
    toString << length << s;

    if(str.size() != length)
		toString << rekChStr(str.substr(length));

	return toString.str();
}
link is offline  
Thanks
1 User
Old 04/02/2012, 23:40   #4
 
xNopex's Avatar
 
elite*gold: 0
Join Date: May 2009
Posts: 827
Received Thanks: 471
Ich bin ein Fan von Rekursion.
xNopex is offline  
Old 04/03/2012, 01:13   #5


 
MrSm!th's Avatar
 
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,909
Received Thanks: 25,409
Sieht man öfters :P, geht mir auch so, dennoch sollte man sie vermeiden, wenn sie nicht implementierungstechnisch den Aufwand erheblich verringert, denn sie birgt nunmal auch immer das Risiko eines Stackoverflows.
MrSm!th is offline  
Old 04/03/2012, 10:44   #6
 
xNopex's Avatar
 
elite*gold: 0
Join Date: May 2009
Posts: 827
Received Thanks: 471
Wenn ich das mal so grob umreiße.. Hat man hier im worst Case ca. ne Tiefe der Anzahl an Zeichen in der Zeichenkette. Wird also weniger das Problem sein, allgemein hast du natürlich Recht.
Jedoch sehe ich v.a. die Vorteile in einer besseren Lesbarkeit. Zugegeben in diesem Fall nicht. Aber wenn man sie klug einsetzt, sind rekursive Lösungen imho immer schöner als hässliche Schleifen. V.a. bei Bäumen undsowas finde ich Rekursion wesentlich eleganter als 10.000 Hilfsvariablen anzulegen, dass man iterativ drüber laufen kann.
Und vermutlich wird der Compiler auch oft meine Rekursion letzendlich wegoptimieren
Bleibt aber Geschmackssache und ich mags :>
xNopex is offline  
Old 04/05/2012, 10:56   #7
Administrator
 
Muddy Waters's Avatar
 
elite*gold: 41624
Join Date: Jan 2010
Posts: 22,728
Received Thanks: 12,654
Ich verstehe leider noch nicht so ganz genau, was du eigentlich vorhast; mag auch daran liegen, dass ich C++ technisch ziemlich eingerostet bin.

Trotzdem mal ein paar Anmerkungen:
Soweit ich das sehe ist die erste for-Schleife obsolet, du könntest diese Überprüfung genausogut in der zweiten for-Schleife machen.

Dein char-Array per while-Schleife zu durchlaufen halte ich für unsicher, damit kannst du dir leicht Zugriffsverletzungen einfangen, sofern der zu überprüfende Char aus irgendeinem Grund nicht in dem Array vorkommt. Besser wäre es wohl ohnehin dein char Array direkt als String zu definieren, sodass du mit Standardfunktionen arbeiten kannst, um nach dem Index eines Chars zu suchen. In dem Fall wäre das string::find, damit ließe sich auch die if-Anweisung zur jeweiligen char Prüfung gegen eine Index Überprüfung ersetzen, die wiederum deutlich kürzer wäre.
Muddy Waters is offline  
Reply


Similar Threads Similar Threads
String problem
10/03/2011 - CO2 Programming - 9 Replies
Is not much of a conquer problem, but more a programming problem, but it's related to Conquer as it's for an ani editor. So the problem is, when I'm reading the ids of the files, then the result is something like this: 561359 1 I have tried split with \n and check if the current char was alpha only, but it still does it :/
[VB08]String in String mit mehreren Funden
08/08/2011 - .NET Languages - 6 Replies
Hey, bin gerade auf ein Problem gestoßen, an dem ich mir seit 3 Stunden die Zähne ausbeiße. Ich will eine Funktion schreiben, die der _StringBetween Funktion von AutoIt gleich ist. _StringBetween gibt in einem Array alle Strings zwischen zwei SubStrings und dem ganzen String aus. Die Ausgabe bei _StringBetween("<h1>test1</h1>&l t;h1>test2</h1>", "<h1>", "</h1>") wäre also idealer Weiße ein Array (x = "test1", x = "test2")... da man in VB08 kein Array returnen kann, komme ich aber einfach...
[C++] string zwischen string
11/11/2010 - C/C++ - 6 Replies
tag gibts direkt ne funktion, mit der man einen passenden string zwischen dem string suchen kann? also meine net .find() sondern sowas ähnliches, die in diesem beispiel "mein string sucht" Bsp: "<span id=\"lalala\">"+string mein_string+"</span>" understanden? :-)
String.au3
09/11/2010 - AutoIt - 2 Replies
Hey, hat jemand die Datei für mich? Ich finde im Internet nichts (ich hoffe ich habe nichts übersehn) Mfg
Getting ID String for RPE
07/15/2009 - Ragnarok Online - 0 Replies
Is there any way for getting ID String for account ID than using openkore ? openkore doesn't work on my server, I need to get the String ID so I can use RPE filter. Does anyone know the solution for this ?



All times are GMT +1. The time now is 03:05.


Powered by vBulletin®
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2026 elitepvpers All Rights Reserved.