Мне нужен класс в котором одно из полей(контейнер) будет подгружаться по мере необходимости. Например когда происходит вызов 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;
}
Это описание ситуации, а не вопрос :)
А вообще, порядок построения аргументов функции не определен, так что у вас, вероятно, в
return std::find_if(storage.begin(), storage.end(),
сначала вычисляется storage.end() (для пустого контейнера), а уже потом storage.begin() (который, добавляя элементы в контейнер, инвалидизирует итератор, возвращенный storage.end()).
В то время как во втором варианте, понятно, порядок обратный, там storage.begin() точно вызывается первым..
Порядок выполнения аргументов функции не определен, и в
std::find_if(storage.begin(), storage.end(),
сначала может выполниться end(), а потом begin().
И всё бы хорошо, но у Вас begin() изменяет контейнер и инвалидирует end().
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости