Было бы трудно победить что-то вроде:
/* untested code */
using std::string;
size_t pos = 0;
vector<int> handles;
while ((pos = xmlstr.find("handle=\"", pos)) != string::npos) {
handles.push_back(atoi(xmlstr.data() + pos + 7));
}
Было бы более эффективно, если бы handles.reserve()
вызывался с правильным размером, или, возможно, если бы handles
было deque
или list
, в зависимости от того, как его нужно использовать позже. Это небезопасный код, если строка xml может быть искажена (xmlstr.data()
не заканчивается нулем, поэтому atoi
может выходить за пределы массива). Он также не проверяет, что handle
не является концом более длинного имени атрибута или действительно ли он является атрибутом.
Использование библиотеки регулярных выражений для регулярного выражения, подобного "\\bhandle=\"\\d+\""
, вероятно, даст вам результаты почти так же быстро, с меньшей вероятностью ошибки. Это все еще не подтверждает, что дескриптор является атрибутом; Вы должны судить, может ли это быть проблемой.