Ответы пользователя по тегу C++
  • Что нужно исправить в этом коде, чтобы из глаз не шла кровь?

    terrier
    @terrier
    Давайте подумаем вместе:
    - Разумно ли добавлять к строке по одному символу с точки зрения производительности?
    - Можем ли мы решить задачу за один проход по итоговому массиву, а не за два в худшем случае как у вас сейчас?
    - Знаем ли мы заранее длину итоговой строки?
    - Можем ли мы в C++ создать строку заранее заданной длины?
    - Есть ли в современном C++ способы пройтись по строке и трансформировать ее не используя явно дополнительные сущности типа индексов?
    - Можем ли мы сделать так, чтобы программа работала для динамически задаваемых входных данных, а не для вкомпиленных?
    Кроме того - у вас серьезная ошибка в этой строчке:
    newStr[i] = newStr[i]+1;
    перечитайте условие.
    Ответ написан
    Комментировать
  • В чём преимущество функций над методами контейнеров?

    terrier
    @terrier
    Ну, прямо сразу мы получаем возможность вызывать std::size() еще и для C-массивов, кроме стандартных контейнеров.
    Также, для нестандартных контейнеров, доступа к коду которых нет, всегда можно добавить свободные функции begin(), end(), size() , в отличие от методов.
    Ответ написан
    Комментировать
  • Требуется ли Object(std::wstring&&) с точки зрения оптимизации?

    terrier
    @terrier
    Нет, не нужен. Второй конструктор покрывает оба случая -
    - приходит rvalue - делаем один move ( без копии )
    - приходит lvalue - делаем копирование + move
    Ответ написан
    6 комментариев
  • Переквалификация из Java в C++?

    terrier
    @terrier
    Добрый день!

    Привет!

    Возможно ли вообще осуществить такой переход и обойтись "малой кровью" без сильной "просидке" по зарплате.

    Ну, это, очевидно зависит от текущей зарплаты. В целом, где-то, в пределах -20% можете рассчитывать, если сейчас вы толковый программист на Java в схожей области.

    Вообщем хочу узнать как будет относиться работодатель если в резюме будет указан опыт на java?

    Нормально.

    Может стоит написать для портфолио что-то в качестве демонстрации навыков (если да то что конкретно)?

    Ну, довольно очевидно, что для позиции C++ на серверах нужно написать сервер. HTTP-сервер, например. Простейший можно написать за вечер, улучшать и дорабатывать можно бесконечно.

    Какие могут быть тестовые задания - например если попросят написать клиент сервер то использовать POSIX или boost::asio.

    Вам скажут, или вы сами спросите.

    Так же интересно что при собеседовании спрашивают,

    Вопросов по самому языку и алгоритмам, скорее всего избежать не удастся.

    Действительно ли в реальной жизни синтаксис это не самое важное, а важно знать алгоритмы, писать красивый чистый код со знанием ООП и умения правильно строить архитектуру?

    В реальной жизни самое важное - успешно задачи решать. Все вполне реально, удачи!
    Ответ написан
    1 комментарий
  • Как построить изучение С++ после С#?

    terrier
    @terrier
    освоить язык за пару недель велосипедостроения?

    Нет.
    Ответ написан
    Комментировать
  • Ошибки при компиляции проекта C++ на linux (makefile)?

    terrier
    @terrier
    vector<DateTime> time;
    template argument for «template class std::allocator» uses local type

    До С++11 нельзя было использовать локальные типы в параметрах шаблона. Вижуал студио вам, видимо, подставляет в параметрах сборки проекта "собирать с последним стандартом" или что-то типа того. Под линуксом, в makefile пропишите -std=c++11 в параметрах компиляции, это включит поддержку фич из этого стандарта.
    ( следующие ошибки как раз из-за того, что нам не удалось правильно объявить этот вектор).

    нет декларации «rand» в этой области видимости

    rand объявлен в хедере cstdlib, который нужно подключить

    unsigned __int16 m_bytesCount = 0;
    function2.cpp:35:9: ошибка: нет декларации «m_bytesCount» в этой области видимости

    __int16 - это некросплатформенный способ объявлять типы фиксированной ширины. Кросплатформенный - подключить cstdint и использовать int16_t и т.д.
    Ответ написан
    1 комментарий
  • Как составить план обучения по C++?

    terrier
    @terrier
    У отуса - это план обучения джуна с каким-то уже коммерческим опытом до миддла. А идея запихнуть себе в голову весь C++ еще до начала коммерческого опыта - не очень осмысленная.
    Пожалуй, лучше бы освоить основы языка в объеме книги Страуструпа ( но не обязательно именно по ней ), плюс добавить git, почитать какие-нибудь статьи по производительности и типичным ошибкам и идти устраиваться джуном. И уже тогда набивать шишки, изучать паттерны/антипаттерны и т.д.

    1) Нужен ли ментор? Так ли его присутствие помогает прогрессировать?

    Полезно, конечно, если найдете хорошего.
    2) Стоит ли сразу "прыгнуть из лодку, чтобы научиться плавать" и пытаться написать какой нибудь простой игровой движок, бота по туториалам, где гуглишь непонятные части и изучаешь темы?

    Написать бота - нормальная идея, к тому же вам нужен будет какой-то код, чтобы показать на собеседовании. Писать что-то большое не надо, по первости это будет лапша из плохого кода, на котором особо не научитесь.
    Ответ написан
    Комментировать
  • Современный C++ для программиста C#?

    terrier
    @terrier
    Есть небольшой опыт общения с плюсиками в универе и пет-проектах.
    ... 10+ летней давности

    Ну, то есть вам с нуля. Окей, если исключаем Страуструпа, то пятое издание хорошей книги Липпмана проапдейтили до C++11.
    Представить себе какую-то одну статью, которая научила бы современному C++ с уровня пет-проектов до сколько-либо приличного сложно.
    Ответ написан
    Комментировать
  • Что делать с include-ами?

    terrier
    @terrier
    Ну, в C++ так не делают.
    Вставлять результаты дефайнов в "#include" явно запрещено, хотя, может быть, было бы и полезно.
    Если вам это действительно сильно нужно - используйте предварительную кодогенерацию, пройтись скриптом по исходникам и подменить какой-нибудь "$placeholder$" на определенную some_const_name должно быть несложно.

    Правильно ли я понимаю, что препроцессор никто и никогда не будет развивать и, видимо, вскоре от него откажутся?

    Нет, пока жив C++, жив и препроцессор.
    Ответ написан
    1 комментарий
  • Почему результат выводится inf?

    terrier
    @terrier
    пс. факториал считается правильно.. проверяла. проблема именно в сумме ряда.

    Проверьте еще раз, например на таком примере: factorial(36)
    Вспомним, что факториал - число большое, а в int влезает не так много. А что у нас там является результатом знакового переполнения в C++, напомните?
    Ответ написан
    8 комментариев
  • Почему не работает этот код с ссылками?

    terrier
    @terrier
    using namespace std;

    Вот не надо так делать и не будет подставляться std::swap (который как известно возвращает void) вместо вашего варианта swap
    P.S. Ну, и, конечно сама функция swap, которая не свапает - это тоже достойно.
    Ответ написан
    1 комментарий
  • Как получить место, откуда выбрасывается sigsegv и ему подобные?

    terrier
    @terrier
    Вам это для чего?
    В случае linux:
    Для анализа глазами постфактум - смотреть core dump с помощью gdb.
    Пробовать делать что-то программно - используйте sigaction() вместо signal() и там вся информация доступная информация передается в параметре siginfo_t *info хэндлера
    Ответ написан
    4 комментария
  • Как печатать указатели в C++?

    terrier
    @terrier
    Но как известно они возвращают указатели.

    Как известно, они возвращают итераторы.

    Есть задачи найти индекс первого и последнего вхождения числа x в последовательность.
    Я решил использовать lower_bound(x) и upper_bound(x)

    Однако, lower_bound и upper_bound возвращают итераторы на первое значение, которое больше или равно ( или соответственно, меньше или равно ) заданному. Для того, чтобы найти конкретно заданное значение нужно использовать, как это ни удивительно find.
    Кроме того, вы же понимаете, что multiset пересортировывает входящую последовательность и она уже будет не такой, как вводит пользователь?

    Если вам нужен индекс, то нужно из итератора, полученного из функции поиска вычесть итератор на начало последовательности. Кроме того не забудьте обработать случай, когда числа в последовательности вовсе нет. Первое вхождение ищется очевидным образом, как найти последнее, пожалуй оставим на самостоятельное изучение.
    Ответ написан
  • Надо ли хранить pqxx::connection?

    terrier
    @terrier
    Создавать соединения постоянно, конечно, не надо. Пока вам достаточно одного соединения с базой можно хранить объект соединения. Для нескольких соединений нужен connection pool. Про его создание в документации libpqxx пишут, что
    spoiler

    If you want to have multiple concurrent transactions, let them work on different connections. An easy way to do this is to set up a connection pool: create a bunch of lazyconnection objects, all initialized with the same connection string. Connections of this type will set themselves up only when they are actually used, so there is no big cost to creating more than you're going to use.

    В реальном продакшне для таких целей используют pgbouncer
    Ответ написан
    2 комментария
  • Как перейти с C++ на C?

    terrier
    @terrier
    Кернигана и Ритчи уже прочитали? Тогда заполируйте это книжкой "21st century C" и к разработке на С вы готовы. Сам язык, как вы правильно заметили относительно компактный.
    Ответ написан
    Комментировать
  • Какое время жизни объекта в std::unique_ptr?

    terrier
    @terrier
    Хотите еще более клевую штуку покажу?
    int main(int argc, char *argv[])
    {
        ttt *t = new ttt();
        t->foo();
        delete t;
    
        t->foo();
    
        return 0;
    }

    Выводит
    Alive 0x55d7770d0c20
    Removing
    Alive 0x55d7770d0c20
    ( собирал чем попало ).
    При вызове деструктора для объекта никто не обязан как-то его "разрушать", скажем занулять область памяти, где он лежал. Это просто договоренность с программистом, что объект удален и обращаться к нему не надо. Что будет если обратиться? Undefined behaviour, частный случай которого мы с вами и наблюдаем.
    Ответ написан
    Комментировать
  • Как создаются большие игры на c++ или c#?

    terrier
    @terrier
    Для AAA-проектов "самописный" движок - это как правило означает, что он был создан выделенной командой разработчиков, используется только внутри проектов данного издателя и наружу не отдается. Яркий пример - Infinity Ward Engine, разные версии которого уже второе десятилетие тянут серию Call of Duty. Или, скажем, движок Diablo 3.
    А так - ну, можете представить себе, что движок обеспечивает то, что "объекты" сталкиваются, груди и волосы колышутся, сетевые сообщения передаются, а вот собрать из всего этого Battlefield предстоит тем десяткам программистов студии-разработчика.
    (Да, стандарт де-факто программирования для AAA-проектов - это, конечно же C++, ради портабельности и производительности. Но для скриптов и инструментов используется куча всего разного C#/Lua/Python и т.д. и т.п.)

    P.S. Вспомнил, кстати, пример интересной игры на самописном движке на C# - Bastion.
    Ответ написан
    Комментировать
  • Можете объяснить данный фрагмент кода?

    terrier
    @terrier
    Во-первых, как pos может быть <= 0, это же невозможно.

    Ошибка в определении типа параметров функции привела к вот таким странностям. Довольно очевидно, что pos, позиция символа в строке - это беззнаковая переменная и проверка на "меньше нуля" излишняя (и вот в остальные функции ее разумно вставлять не стали). Все вот эти
    int findspace(int pos);
    int newpos(int pos);
    int exptab(int pos);
    должны принимать и возвращать беззнаковое, но видимо про эти типы Тондо и Гимпел еще не дочитали.
    Ответ написан
    4 комментария
  • Есть ли в С++ аналог #region из C#?

    terrier
    @terrier
    Да
    #pragma region
    https://msdn.microsoft.com/ru-ru/library/b6xkz944.aspx
    Однако, понятно, что это нестандартное расширение и где-то за пределами Visual Studio работать не обязано
    Ответ написан
    Комментировать
  • Как используя protobuf принять объект неизвестного типа?

    terrier
    @terrier
    Самый разумный путь здесь дописывать в начало сообщения номер protobuf-типа, а потом уже сам protobuf-объект. Понятно, что предварительно обе стороны должны договориться какому номеру какой тип соответсвует.
    Ответ написан
    1 комментарий