crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Посчитать количесвто элементов в xml без рекурсии, TinyXml2 + std
RazrFalcon
  опции профиля:
сообщение 19.10.2013, 2:37
Сообщение #1


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


Основаня идея сдесь: 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: заодно может быть есть более элегантный способ пройтись по всем элементам.

Сообщение отредактировал RazrFalcon - 19.10.2013, 2:38
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 19.10.2013, 4:40
Сообщение #2


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


ты затёр вектор:
list.swap(tmp);

у тебя рушится итератор. нельзя так делать.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 19.10.2013, 12:29
Сообщение #3


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


Так без swap я не обновляю вектор же... Как тогда объеденить вектор?
Разве list.end() не обновляется после этого?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 19.10.2013, 13:05
Сообщение #4


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


Решил так:
...
    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 работаю всего пару дней...

Сообщение отредактировал RazrFalcon - 19.10.2013, 13:05
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 24.4.2024, 12:57