Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Посчитать количесвто элементов в xml без рекурсии
Форум на CrossPlatform.RU > Разработка > С\С++
RazrFalcon
Основаня идея сдесь: http://www.forum.crossplatform.ru/index.ph...ic=9359&hl=
Но теперь нужно сделать без Qt.

Вроде бы сделал по аналогии, но прога падает:
vector<XMLElement *> Tools::childElemList(XMLElement *parentElem)
{
    vector<XMLElement *> list;
    XMLElement *child;
    for (child = parentElem->FirstChildElement(); child; child = child->NextSiblingElement())
        list.push_back(child);
    return list;
}

void calcElemCount(XMLDocument *doc)
{
    int elemCount = 0;
    vector<XMLElement *> list = childElemList(doc->FirstChildElement());
    vector<XMLElement *>::iterator it;
    for (it = list.begin(); it != list.end(); ++it) {
        elemCount++;
        XMLElement *elem = *it;
        // cout << elem->Name() << endl; // падает тут если расскоментировать, или дальше по коду (elem не NULL)
        if (!elem->NoChildren()) {
            vector<XMLElement *> childList = childElemList(elem); // падает тут, при очередной попытке получить список дочерних элементов
            vector<XMLElement *> tmp;
            tmp.reserve(list.size() + childList.size());
            std::merge(list.begin(), list.end(), childList.begin(), childList.end(), std::back_inserter(tmp));
            list.swap(tmp);
        }
    }
    cout << elemCount << endl;
}

Не могу понять причину падения.

PS: заодно может быть есть более элегантный способ пройтись по всем элементам.
Iron Bug
ты затёр вектор:
list.swap(tmp);

у тебя рушится итератор. нельзя так делать.
RazrFalcon
Так без swap я не обновляю вектор же... Как тогда объеденить вектор?
Разве list.end() не обновляется после этого?
RazrFalcon
Решил так:
...
    for (it = list.begin(); it != list.end(); ++it) {
        elemCount++;
        XMLElement *elem = *it;
        if (!elem->NoChildren()) {
            vector<XMLElement *> childList = childElemList(elem);
            size_t offset = it - list.begin();
            list.insert(list.end(), childList.begin(), childList.end());
            it = list.begin() + offset;
        }
    }
...

Вроде работает, с std работаю всего пару дней...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.