ну, мне нужно обработать большой кусок текста, анализируя его линейно от начала до конца. И мне интересно, что лучше для этого: использование 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);
этот код ужасен до чертиков, я только начинаю с низкоуровневой арифметики указателей и прочего, до сих пор использовал визуальные компоненты, так что не судите слишком сильно