Невалидный итератор после поиска

99
22 июня 2021, 03:30

Мне нужен класс в котором одно из полей(контейнер) будет подгружаться по мере необходимости. Например когда происходит вызов begin() данные подгрузятся.

Так же у меня есть шаблонная функция поиска, в которой я использую std::find_if, но с ней не хочет дружить отложенная загрузка.

#include <algorithm>
#include <vector>
#include <iostream>
#include <string>
class my_storage
{
public:
    using container = std::vector<std::string>;
    using iterator = container::iterator;
    iterator begin()
    {
        m_container.push_back("Mike");
        m_container.push_back("John");
        m_container.push_back("David");
        return m_container.begin();
    }
    iterator end()
    {
        return m_container.end();
    }
private:
    container m_container {};
};

template<class T>
typename T::iterator find_David(T& storage)
{
    auto find_lambda {[](const std::string& element)
                      {
                          return element == "David";
                      }};
    return std::find_if(storage.begin(), storage.end(),
                        find_lambda); // с этим итератором будет segmentation fault
    auto begin {storage.begin()};
    return std::find_if(begin, storage.end(), find_lambda); // а так работает
}

int main(int argc, char *argv[])
{
    my_storage storage {};
    auto david_it {find_David(storage)};
    if (david_it != storage.end()) {
        std::cout << "David exists" << std::endl;   
        std::cout << *david_it  << std::endl;
    }
    return 0;
}
Answer 1

Это описание ситуации, а не вопрос :)

А вообще, порядок построения аргументов функции не определен, так что у вас, вероятно, в

return std::find_if(storage.begin(), storage.end(),

сначала вычисляется storage.end() (для пустого контейнера), а уже потом storage.begin() (который, добавляя элементы в контейнер, инвалидизирует итератор, возвращенный storage.end()).

В то время как во втором варианте, понятно, порядок обратный, там storage.begin() точно вызывается первым..

Answer 2

Порядок выполнения аргументов функции не определен, и в

std::find_if(storage.begin(), storage.end(),

сначала может выполниться end(), а потом begin().

И всё бы хорошо, но у Вас begin() изменяет контейнер и инвалидирует end().

READ ALSO
Компиляция Qt 4.8.7 приложения под Linux

Компиляция Qt 4.8.7 приложения под Linux

С Linux'ом практически никогда не работал, поэтому в этой теме абсолютный ноль, очень надеюсь на вашу помощь

73
Есть ли в Android SDK функция - аналог jQuery.param()?

Есть ли в Android SDK функция - аналог jQuery.param()?

В библиотеке jQuery есть функция param()

101
Позиционирование label

Позиционирование label

Не получается задать позиционирование тексту для загрузки аватараЕсть еще одна проблема, имеется выпадающее меню в вверху, она перестала...

91