Задать вопрос
  • Как присвоить пару?

    Ваше присваивание выполняет p1.first = p2.first и p1.second = p2.second. Но вы запретили присваивать в p1.first, объявив его как const.
    Ответ написан
    Комментировать
  • Почему lower_bound не видит operator, хотя он определен?

    operator< ищется через ADL. Нельзя определить оператор для чужих типов, и чтобы его подхватили алгоритмы. Предлагаю такое решение: вместо char искать свою структуру (её можно определить просто как struct с char), для которой определить сравнение так же, как ты это сделал с char.
    Ответ написан
    5 комментариев
  • Как выбрать тип в runtime?

    std::any позволяет сохранить в себя объект любого типа, после чего через any_cast вытащить значение, если оно такого типа, как мы предполагаем. Проверка осуществляется через RTTI. Если поддерживается много конкретных типов, вы должны писать здоровенную цепочку if-else-if. В таком случае лучше уж идти через наследование.
    Ответ написан
    Комментировать
  • Есть ли область видимости у директив препроцессора C++?

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

    namespace what {
    #define apples 2
    }
    
    namespace stuff {
        class foo {
        private:
            int apples = 3;  // ОШИБКА: 2 - недопустимое имя
        public:
            int read_apples() {
                return apples;  // 2
            }
        };
    }


    Мораль: не используйте макросы там, где можно обойтись constexpr константами или inline функциями. А там, где они необходимы, давайте им длинные страшные КРИЧАЩИЕ_ИМЕНА.
    Ответ написан
    Комментировать
  • Как спарсить строку с выбором вариантов на C++ Builder?

    Общий подход предлагаю такой. Заводите std::vector<std::vector<std::string>>. Каждый внутренний вектор хранит варианты выбора для очередного куска строки. В частности, для кусков строки между вариативными частями будем считать, что есть всего 1 вариант выбора. Соответственно, весь вектор векторов — это последовательность таких вариативных частей. Задача делится на 2 части:

    1. Парсинг входной строки в нашу структуру. Парсим в цикле, вытаскивая из исходной строки по 1 символу, и аккумулируем в промежуточное состояние. Нам понадобится std::string для текущего варианта и std::vector<std::string> для текущей вариативной части.

    2. Самое простое, когда наш вектор векторов заполнен, создаём пустой std::string, и накидываем туда из каждого внутреннего вектора по 1 варианту.
    Ответ написан
    Комментировать
  • Что делает этот конструктор?

    Это объявление (declaration) конструктора. Значения полей должны быть заданы в определении (definition). Раз определения тут нет, значит, его нужно искать где-то в другом месте. Возможно, вы найдёте его в одном из следующих шагов. Возможно, его написание оставлено как упражнение для читателя. Возможно, содержимое конструктора (присвоение параметров полям) авторы посчитали очевидным.

    Пример определения, которое должно следовать за таким классом:
    Cls::Cls(char c, double d, int i)
        : c(c), d(d), i(i) {}
    Ответ написан
    Комментировать
  • Как найти часто встречающиеся тексте последовательности?

    Обратите внимание, что std::string использует SBO, то есть не выделяет доп. память в куче для коротких строк. Ещё стандартные мапы в C++ крайне неэффективны, подключите библиотеку. Идея такова:
    1. Хешмап "строки -> счётчики" для строк длины 3
    2. Хешмап "строки -> счётчики" для строк длины 4, но добавляем туда только строки, у которых начало длины 3 входит в мапу из (1) не менее 2 раз
    3. Хешмап "строки -> счётчики" для строк длины 5, но добавляем туда только строки, у которых начало длины 4 входит в мапу из (2) не менее 2 раз
    Ответ написан
    Комментировать
  • Собираюсь идти в сферу программирования. Изучаем в школе языки. Какой лучше выучить Pascal или C++?

    Почему никто не советует Python?! Живой язык программирования, реально применяется, и он не так мешает, с ним не так надо воевать, как с C++. Отличный учебный язык, на большинстве адекватных курсов для школьников, и ЕГЭ в частности, учат ему. Наконец, часто сами проверяющие комиссии "думают" на этом языке, и когда люди возмущаются, мол, задачи слишком сложные, показывают коротенькую программу на Python.

    У Python железные преимущества: простота освоения и краткость кода. И 2 основных недостатка: низкая производительность и, ИМХО, излишняя динамичность — на ЕГЭ не важно.

    По поводу других вариантов: Pascal мёртвый язык и довольно отстал от жизни. C++ — очень сложный язык. Наспех вы можете только пополнить ряды говнокодеров. В случае с Python, сделать это (пополнить ряды) непросто.
    Ответ написан
  • Как правильно использовать typedef?

    Убери предпоследнюю строку. Компилятор жалуется на дублирующееся объявление метода IdentifyLength, а не на typedef. К слову, в новом коде вместо typedef следует использовать using:

    using DigitArea = unsigned int;

    А ещё лучше - использовать типы из <cstdint> по умолчанию. Например:

    using DigitArea = std::int64_t;
    Ответ написан
    Комментировать
  • Почему компилируется 'Hello, World!', хотя был введен другой код?

    #include "std_lib_facilities.h"
    Вы уверены, что скопировали в проект файл std_lib_facilities.h и подключили его должным образом?
    Ответ написан
    1 комментарий
  • Как собрать рабочее окружение для IPad для программирования на С++?

    Всё программы, позволяющие компилировать код на мобильных устройствах, особенно на iPad, на самом деле шлют код на компиляцию в один из популярных сервисов. Они позволяют компилировать только игрушечные, учебные программы, и не годятся для много-мегабайтных и гигабайтных сборок.

    Чтобы программировать через iPad в пути, рекомендую TeamViewer или аналоги. Конечно, здесь важно стабильное, скоростное подключение к интернету.
    Ответ написан
    Комментировать
  • Есть ли в для C++14 map с поддержкой constexpr хэша?

    Предрасчитанный ключ - вполне валидная стратегия, если расчёт хеша сильнее влияет на производительность, чем хранение дополнительных 8 байтов на элемент.

    template <typename T>
    class hashed {
        T value_;
        size_t hash_;
    
        friend class std::hash<hashed<T>>;
    public:
        template <typename... Args>
        constexpr hashed(Args&&... args) :
            value_(std::forward<Args>(args)...),
            hash_(std::hash<T>()(value_))
        {}
    
        // rule of zero
    
        constexpr T& get() & noexcept { return value_; }
        constexpr const T& get() const& noexcept { return value_; }
        constexpr T&& get() && noexcept { return value_; }
        constexpr const T&& get() const&& noexcept { return value_; }
    };
    
    namespace std {
        template <typename T>
        struct hash<hashed<T>> {
            constexpr size_t operator()(const hashed<T>& x) const noexcept {
                return x.hash_;
            }
        };
    }
    
    std::unordered_map<hashed<std::string>, int> cache;
    auto it = cache.find("property1");  // хеш на этапе выполнения
    
    // хеш на этапе компиляции, работает с constexpr std::string из C++20
    constexpr auto h = hashed<std::string>("property1");
    
    auto it2 = cache.find(h);  // предрасчитанный хеш
    Ответ написан
  • Для какой задачи на практике может потребоваться использовать в качестве параметра шаблона указатель на функцию-член?

    Когда лень писать лямбду. Часто [](widget& w) { return w.foo(); } можно заменить на widget::foo.
    Ответ написан
    Комментировать
  • Как логически разбить цены на 5 диапазонов, если цены больше 5?

    Алгоритмы кластеризации, например, KMeans, решают подобные задачи.

    # lang: Python 3.5
    import numpy as np
    from sklearn.cluster import KMeans
    
    cl = KMeans(n_clusters=5)
    labels = cl.fit_predict(np.array([[600], [1000], [4500], [5000], [6500], [7000], [7500], [10000]))
    #=> [0 0 3 3 1 1 4 2]

    Отсортировать кластеры по возрастанию уже не составляет труда.
    Предлагаю вам самому найти реализацию KMeans для вашего языка.
    Ответ написан
    Комментировать
  • Почему происходит ошибка разворачивания инициализированного опционала,?

    А зачем вам здесь вообще Bool? понадобился?
    Если флаг успеха, то лучше var per2 = false.
    Ещё, у вас есть блок try-catch, но в нём ни одного try.
    Ещё, вы выводите не-развёрнутый Optional, о чём, к счастью, предупредит компилятор.
    Кроме того, у вас может произойти отказ в разных местах, так что стоит подумать над использованием ошибок / "исключений" Swift:

    func aaa() throws {
                let fetchResult = try PersistenceService.contex.fetch(fetchRequest)
    
                for item in fetchResult {
                    let per = item.password
                    guard let pass = per else {
                        throw AaaErrors.passwordNotCreated
                    }
                    print("пароль \(pass!)")
                }
        }
    Ответ написан
    Комментировать
  • Как при открытии файла имя файла указывать переменной?

    Замечу, что в современном C++, c_str не нужно:

    auto fullPath = filename + format;
    std::ofstream file(fullPath);

    Если у вас требуется c_str, то вы используете C++98, добавьте флаг -std=c++14.
    Ответ написан
    Комментировать
  • В чем заключается выбор между C и С++ для написания драйверов?

    C++ не может повредить. Если вы используете virtual, RTTI, exceptions, iostreams, то вы платите за них, но если эта цена неприемлема - просто не используете их.

    Однако C++, особенно C++11 и C++14, часто не поддерживаются компилятором, когда приходится собираться не под уютные gcc/clang x86, а что-нибудь специфическое, вроде Arduino или CUDA. Ещё в ядре Linux C++ традиционно под запретом.

    Так что посмотрите, можете ли вы использовать C++ в вашем конкретном случае. Если нет, то выбирать не из чего.
    Ответ написан
    Комментировать
  • Что означают A.Type и A.self, где A - некий класс, в языке Swift?

    Для любого типа T, T.Type - это метатип (metatype), то есть тип, объекты которого предоставляют описание типа T. Статические функции и init-функции T становятся функциями-членами T.Type. Пример:

    struct Duck {
        static func kind() -> String { return "Bird" }
        init() { }
        func talk() { print("Quack") }
    }
    
    let meta: Duck.Type = Duck.self
    meta.kind()  //=> Bird
    let obj: Duck = meta.init()
    obj.talk()  //=> Quack


    Существует 2 класса метатипов, но на практике встречаются existential metatypes, то есть их объекты могут описывать как данный тип T, так и любой наследник (subtype) типа T. Другими словами, множество объектов типа T.Type - это U.self для всех типов U: T. Пример:

    class Animal { class var name: String { return "Animal" } }
    class Cat: Animal { override class var name: String { return "Cat" } }
    class Dog: Animal { override class var name: String { return "Dog" } }
    
    var meta: Animal.Type
    meta = Cat.self
    meta.name  //=> Cat
    meta = Dog.self
    meta.name  //=> Dog


    Или, например, можно представить себе такую функцию генерации животных:

    class Animal { ... }
    
    func createAnimal(_ type: Animal.Type) -> Animal {
        if type == Cat.self {
            return Cat(...)
        } else if type == Dog.self {
            return Dog(...)
        } else {
            fatalError()
        }
    }


    На практике, такая функциональность метатипов используется редко. Как правило, они служат для явной специализации шаблонных функций. Например:

    func unsafeCast<T, U>(_: T, to: U.Type) -> U

    Здесь единственный способ указать тип U при вызове - это передать "фиктивный" параметр тип U.Type, так как аргументов типа U функция не принимает. Вернее, это лучший и принятый в Swift способ. Можно было бы выкрутиться вот так:

    func unsafeCast<T, U>(_: T, sameAs: U) -> U

    Но, понятно, что для этого нужно иметь под рукой объект типа U, и это не идеальный вариант. Жаль, что нельзя писать просто unsafeCast<U>(t) при вызове.

    При использовании метатипа U.Type таким образом, его значение, как правило, игнорируется. То есть даже если вы передадите туда метатип наследника типа U, то функция всё равно будет работать с U.

    P.S. Есть ещё много недокументированных фич метатипов в Swift, но там всё не очень логично и продуманно (даже разработчики из Core team не всё там понимают), так что на практике лучше ограничиться применением для явной специализации функций, как показано выше.
    Ответ написан
    1 комментарий