Каков наилучший способ печати на консоль в c++?

Я прочитал три способа распечатать вещи на консоли в c++ из разных источников.

  1. Использование using namespace std; и затем используя cout (CodeBlocks Standard)
  2. Не использовать выше и использовать std::cout и std::endl; (c++ Primer)
  3. Использование printf (HackerRank)

Что предпочтительнее и почему?

Ответ 1

Номер 2 с поправкой. (std::cout и '\n')

Зачем?

  1. Потому что вам следует избегать using namespace std. Источник
  2. (Среди других причин) Поскольку cout является typeafe, а printf - нет. Источник
  3. std::endl заставит поток буфера вывода на консоль. Если вы специально не хотите, чтобы это произошло, используйте << '\n' или << "...string\n". Источник

Ответ 2

Если вы действительно не заботитесь о скорости, оба cout и printf в порядке. Если вам требуется более быстрое время автономной работы, вот несколько указателей:

  • Используйте только printf без cout. Это даст больше скорости, чем использование смеси printf и cout или просто cout.
  • Или используйте только cout, но добавьте следующее в начале выполнения ios_base::sync_with_stdio(false);cin.tie(NULL); , Существует два отдельных потока для printf и cout, и по умолчанию они синхронизируются. Из-за этой синхронизации тратится много времени. Эти две строки кода остановят синхронизацию, но следите за тем, чтобы вы не использовали printf, если вы добавляете эти строки, иначе печать может произойти в случайном порядке.
  • Не используйте endl если вы хотите очистить выходной буфер. Многие endl могут сделать код медленнее. Использовать cout<<'\n'; вместо.

Ответ 3

это мой код отладчика, который за эти 10 лет работы c++ помог мне.

std::ostream &debugRecord (const char* fileName, int lineNum, const char* funcName)
{
    std::lock_guard<std::mutex> lock(streamMutex_);
    return std::cout << "Thread # " << getCurrentThreadId() << " -- "
                     << "(" << fileName << ":" << lineNum << "): " << funcName << std::endl;
}

Ответ 4

Оба ваших первых пункта делают в основном одно и то же. Лучше использовать std:: вместо using namespace std; поскольку последний загрязняет глобальное пространство имен и может вызвать конфликты именования.

Не упоминается, что вы можете выборочно выставлять части пространства имен с using <namespace>::<element>; (например, using std::cout;). По-прежнему лучше быть подробным с вашими утверждениями, но этот параметр все же не так плох, как разоблачение всего пространства имен.

printf не так безопасен, как cout (операторы потока << делают хорошую работу по печати, что вы хотите), вам следует избегать ее при запуске.

Ответ 5

Ответ зависит от того, что вы хотите сделать. Для вывода, который в основном использует форматы по умолчанию, cout действительно предпочтительнее из-за безопасности типа и потому что он очень интуитивно понятен.

Если вы хотите сильно форматировать свой вывод, я могу только рекомендовать удивительно универсальный и прямой printf потому что манипуляторы в cout - это боль. Истина: синтаксис формата printf, скажем, немного привыкает, но он того стоит. Просто дважды проверьте строку формата, послушайте предупреждения своего компилятора и используйте соответствующие спецификации формата, например, для size_t и других системных зависимых данных, чтобы оставаться портативными.

Существует также средство для объединения потоков и форматирования стиля printf, см. fooobar.com/info/307942/..., но я никогда не использовал его. Возможно, кто-то может прокомментировать его удобство использования?