min4er min4er Автор вопроса
Вероятно меня не совсем верно поняли. Я как раз хочу изучить как писать конфиги, мейки, лдфлаги ставить. Есть ли учебник, где бы C/C++ подавался именно в таком разрезе? То есть, грубо говоря, имеется охапка файлов *.c и *.h а теперь к ней нужно сочинить config, make и т. д. и как это правильно делать.
Однако в учебниках обычно описывается сам язык, но ничего не говорится про всякие GNU-тые утилиты и как ими пользоваться.Это в совсем-совсем учебниках по языку. Например в серии для программистов даже половины кода не написано, потому что подразумевается что и так понятно.) Тут не столько туториал по языку нужен, сколько руководство по программированию в среде и документация к компилятору.
auto EventManager::try_emplace(const Listener&& lstr)
{
auto sucess = m_listeners->try_emplace({lstr._name, {}});
if(!sucess.second)
{
std::cout << "key '" << lstr._name << "' "
<< "already exist" << std::endl;
}
}
int main()
{
std::list<std::string> events { "Open", "Move", "Close" };
EventManager eManager{ events };
eManager.print();
eManager.try_emplace({"open"});
eManager.try_emplace({"Open"});
eManager.print();
}
OUT:
Close ->
Move ->
Open ->
key 'Open' already exist
Close ->
Move ->
open ->
Open ->
: m_listeners { std::make_unique() }
Начиная с C++11 в STL появились умные указатели, помогающие отслеживать динамическую память и ее использование. Даже до C++11 существовал класс auto_ptr, который мог управлять динамической памятью, но его было легко применить неправильно.
Однако с появлением умных указателей теперь редко приходится самостоятельно использовать ключевые слова new и delete, и это очень хорошо. Умные указатели — отличный пример автоматического управления памятью. Поддерживая объекты, память для которых выделяется динамически с помощью unique_ptr, мы защищены от утечек памяти, поскольку при разрушении объекта данный класс автоматически вызывает поддерживаемый им объект.
Уникальный указатель выражает принадлежность объекта, на который ссылается, и выполняет свою задачу по освобождению его памяти, если та более не используется. Этот класс может навсегда освободить нас от утечек памяти (во всяком случае вместе со своими компаньонами shared_ptr и weak_ptr, но в этом примере мы концентрируемся только на unique_ptr). Самая приятная особенность заключается в том, что он не влияет на производительность и свободное место в сравнении с кодом, содержащим необработанные указатели и предусматривающим ручное управление памятью. (О’кей, он все еще устанавливает значение внутреннего необработанного указателя на nullptr после разрушения объекта, на который он указывает, и это нужно учитывать при оптимизации. Большая часть кода, управляющего динамической памятью и написанного вручную, делает то же самое.)
Разыменовать уникальный указатель можно с помощью функции get(), возвращающей необработанный указатель на объект, или непосредственно с применением operator*, что опять же делает их похожими на необработанные указатели.
Одна из важных характеристик unique_ptr заключается в том, что его экземпляры нельзя скопировать, но можно переместить из одной переменной типа unique_ptr в другую. Если бы мы могли скопировать уникальный указатель, то это значило бы, что объектом обладали сразу два указателя. Такое положение дел противоречит идее уникальных указателей, которая гласит: он может быть единственным владельцем объекта (а позже «удалителем»).
Поскольку существуют структуры данных, такие как unique_ptr и shared_ptr, необходимость создавать объекты в куче вручную с помощью ключевых слов new и delete возникает редко. Используйте эти классы везде, где возможно! unique_ptr не создает никаких лишних издержек во время выполнения.
insert_it = m_listeners->insert( insert_it, {et, {}} );
Поиск элементов в контейнере std::map занимает время O(log(n)). То же касается вставки новых элементов, поскольку позицию, на которую нужно добавить новый элемент, тоже необходимо найти. Простая вставка М новых элементов займет время O(M * log(n)).
Чтобы операция была более эффективной, функция вставки контейнера std::map принимает необязательный параметр, представляющий собой подсказку для вставки. Это, по сути, итератор, который указывает на место, близкое к будущей позиции вставляемого элемента. Если подсказка корректна, то амортизированное время вставки составит O(1).
Поскольку изначально ее у нас нет, выполним первую операцию вставки, указывая на конечный итератор
auto insert_it(std::end( *m_listeners ));
#include <iostream>
#include <cmath>
using namespace std;
void pobieranie(const int& n, double* x, double* y)
{
cout<<"Enter x y ";
for(int i = 0; i < n; ++i)
{
cin >> x[i]
>> y[i];
}
}
int pobieranie2(double& szukana, const int& n, double* x, double* y)
{
cout << "Enter szukana: ";
cin >> szukana;
if(szukana >= x[0] && szukana <= x[n - 1])
{
//...
}
for(int i = 0; i < n; ++i)
{
cout << x[i] << ' ' << y[i] << '\n';
}
}
int main()
{
int n = 3;
double szukana = 0;
double x[n] = {0, 0, 0};
double y[n] = {0, 0, 0};
pobieranie(n, x, y);
pobieranie2(szukana, n, x, y);
}