Строка std против производительности char, лучшая техника для удаления частей с самого начала - PullRequest
2 голосов
/ 16 марта 2011

ну, мне нужно обработать большой кусок текста, анализируя его линейно от начала до конца. И мне интересно, что лучше для этого: использование char * или std :: string. при использовании char * я могу изменить указатель на позицию дальше в строке, например.

//EDIT later: mallocing some space for text
char str[] = "text to analyse";
char * orig = str;
//process
str += processed_chars; //quite fast
//process again
// later: free(orig);

но используя строку, мне, возможно, придется использовать std :: string :: erase - но она создает копию, или перемещает байты или что-то еще (я не знаю фактическую реализацию)

string str = "text to analyse";
//process
str = str.erase(0,processed_chars);

или есть способ изменить скрытый указатель std :: string?

РЕДАКТИРОВАТЬ: как Сильвен Дефресн просил здесь больше код:

class tag {
public:
    tag(char ** pch) {
        *pch = strstr(*pch,"<");
        if(pch == NULL) return;

        char *orig = *pch+1;
        *pch = strstr(*pch,">");
        if(pch == NULL) return;
        *pch+=sizeof(char); //moving behind the >

        //process inner tag data

        if(*(*pch-2)!='/'){// not selfclose
            while (!(**pch == '<' && *(*pch+1) == '/')){ //sarch for closing tag
                tag* kid = new tag(pch);
                sublings.push_back(*kid);
            }

            *pch = strstr(*pch,">");
            if(pch == NULL) return;
            *pch+=sizeof(char); //moving behind the >

            //add check if the clothing tag is matching

        }
    }
}

я использую его для рекурсивного синтаксического анализа в стиле xml

char str[] ="<father><kid /></fatherr>";
char * pch = str;
tag *root = new tag(&pch);

этот код ужасен до чертиков, я только начинаю с низкоуровневой арифметики указателей и прочего, до сих пор использовал визуальные компоненты, так что не судите слишком сильно

Ответы [ 3 ]

5 голосов
/ 16 марта 2011

С std::string вы, вероятно, будете использовать std::string::iterator. Ваш код будет:

std::string str = "text to analyse";
std::string::iterator iter = str.begin();

// process
iter += processed_chars; 
2 голосов
/ 16 марта 2011

Все, что вы можете сделать с char*, вы можете сделать с std::string::iterator.

1 голос
/ 16 марта 2011

Вы можете использовать std::string::iterator (смотрите здесь ).

std::string не является необходимым в такой задаче (но такие классы как std::string очень полезны в других ситуациях).

...