Блог пользователя MikeMirzayanov

Автор MikeMirzayanov, история, 8 лет назад, По-русски

Рад сообщить вам, что C++14 добавлен в список поддержанных языков на Codeforces. Выбор компилятора пал на MinGW-w64, версия GCC 6.2.0 (будем обновлять по мере выхода). Если у вас Windows, то установить именно эту сборку можно из PBOX одной командой pbox install mingw-w64.

Кроме новомодных фишечек C++14 (не уверен, что есть много полезного для соревнований), есть такие плюсы:

  • эта сборка быстрее mingw-tdm 5.1.0 работает с cin/cout — например перевернуть последовательность 106 целых чисел от 1 до 106 работает 1.5 секунды вместо 2.5 (и 0.3 вместо 1 при использовании std::ios::sync_with_stdio(false))
  • корректно работает вывод double как со спецификаторами как %f так и %lf (читать надо с помощью %lf)
  • корректно работает ввод-вывод long double как со спецификатором %Lf
  • корректно работает ввод-вывод long long как с %lld так и с %I64d

Вероятно, чтобы уменьшить не очень нужное разнообразие реализаций C++ через некоторое время MinGW С++ и MinGW С++11 будут исключены, тем более что их сложно обновить до GCC 6 из-за сложностей с обратной совместимостью. Конечно, через некоторое время C++14 появится и в Polygon.

  • Проголосовать: нравится
  • +1159
  • Проголосовать: не нравится

»
8 лет назад, # |
  Проголосовать: нравится +28 Проголосовать: не нравится

Are there any nifty features like those from c++11?

  • »
    »
    8 лет назад, # ^ |
      Проголосовать: нравится +47 Проголосовать: не нравится

    Mostly for jury it will be good idea to use apostrophe to separate thousands (say, in validators) like:

    int n = inf.readInt(1, 1'000'000'000, "n");
    
    • »
      »
      »
      8 лет назад, # ^ |
        Проголосовать: нравится +1 Проголосовать: не нравится

      1e9 is in C++ for already long time :). It is by far the best way of inputting large bounds in my opinion.

      • »
        »
        »
        »
        8 лет назад, # ^ |
          Проголосовать: нравится +56 Проголосовать: не нравится

        as long as it doesn't fail silently

        • »
          »
          »
          »
          »
          8 лет назад, # ^ |
            Проголосовать: нравится -8 Проголосовать: не нравится

          Yeah, I was aware of that and I silently expressed that by subtle choice of words =). That's why I said "bounds" not "numbers" :D. One should be aware of that however that's very rare usage whereas inputting something like 1e5 + 5 needs to be done in literally almost every problems.

          • »
            »
            »
            »
            »
            »
            8 лет назад, # ^ |
              Проголосовать: нравится +62 Проголосовать: не нравится

            Don't write comment if you know it may mislead someone.

            "My comment may be interpreted in such a way that it's correct" isn't a strong argument.

            • »
              »
              »
              »
              »
              »
              »
              8 лет назад, # ^ |
                Проголосовать: нравится +34 Проголосовать: не нравится

              Yeah, I guess it could have been misleading. Sorry for that. I had mentioning it in my mind, but I was in a bit of hurry and was writing from mobile, so that's because I chose replacing "numbers" with "bounds" =p.

        • »
          »
          »
          »
          »
          8 лет назад, # ^ |
          Rev. 3   Проголосовать: нравится -27 Проголосовать: не нравится

          ...

        • »
          »
          »
          »
          »
          8 лет назад, # ^ |
          Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

          With just a little more typing, maybe do int64_t x = (int64_t) 1e18 + 1;?

          • »
            »
            »
            »
            »
            »
            8 лет назад, # ^ |
              Проголосовать: нравится 0 Проголосовать: не нравится

            Is it guaranteed to work?

          • »
            »
            »
            »
            »
            »
            8 лет назад, # ^ |
              Проголосовать: нравится +3 Проголосовать: не нравится

            it works only accidentally.

            • »
              »
              »
              »
              »
              »
              »
              8 лет назад, # ^ |
                Проголосовать: нравится -10 Проголосовать: не нравится

              What exactly here is an 'accident'? Fact that (int64_t)1e18 == 1000000000000000000?

              • »
                »
                »
                »
                »
                »
                »
                »
                8 лет назад, # ^ |
                Rev. 3   Проголосовать: нравится +8 Проголосовать: не нравится

                more like fact that 2 | 10 (I mean base used in computers is divisible by base used by people, not particular numbers), so 10^n is divisible by several powers of 2

      • »
        »
        »
        »
        8 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится

        Maybe this could be a solution? You may pre-define as many as you want in your default code so you won't have to type it every time.

    • »
      »
      »
      8 лет назад, # ^ |
      Rev. 2   Проголосовать: нравится +16 Проголосовать: не нравится

      Please could you update the source code highlighter to support this feature, because the current one thinks that those apostrophes are character literals and the formatting becomes ugly.

      #include<iostream>
      using namespace std;
      
      int test = 1'000'000'000;
      
      int main() {
      
      }
      
  • »
    »
    8 лет назад, # ^ |
    Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

    Now you can write auto in lambdas, make recursive dfs in lambda without unnecessary overhead, etc

  • »
    »
    8 лет назад, # ^ |
      Проголосовать: нравится +16 Проголосовать: не нравится

    you now can do things like this

    #include<iostream>
    #include<stdio.h>
    using namespace std;
    
    bool zero = 0;
    char one = '1';
    short two = 2;
    int three = 3;
    long long four = 4;
    
    int cnt;
    void z(auto a, auto b, auto c, auto d, auto e, auto f, auto g, auto h){
    	if(h!=zero){
    		cout<<a<<b<<c<<d<<e<<f<<g<<h<<endl;
    		++cnt;
    		return ;
    	}
    	z(one,a,b,c,d,e,f,g);
    	z(two,a,b,c,d,e,f,g);
    	z(three,a,b,c,d,e,f,g);
    	z(four,a,b,c,d,e,f,g);
    }
    
    int main(){	
    	z(zero,zero,zero,zero,zero,zero,zero,zero);
    	cout<<cnt<<endl;
    	return 0;
    }
    
»
8 лет назад, # |
Rev. 2   Проголосовать: нравится +14 Проголосовать: не нравится

MikeMirzayanov, почему бы не добавить компилятор MS C++ 2013 или 2015?

  • »
    »
    8 лет назад, # ^ |
      Проголосовать: нравится -28 Проголосовать: не нравится

    Зачем он тебе? Все что есть там, будет и в этом компиляторе

    • »
      »
      »
      8 лет назад, # ^ |
        Проголосовать: нравится +24 Проголосовать: не нравится

      Например, на домашнем компе стоит MS VS 2013/2015, используется для компиляции и отладки перед отправкой. То, что компилируется в MS VS, далеко не всегда компилируется в GCC. Аналогично, то, что правильно работает в MS VS, может неправильно работать в GCC. Все это потому что MS VS иногда "прощает" отступление от стандарта и не делает UB там, где это может сделать GCC. А во время раунда тратить время на то, чтобы прогнать решение в двух компиляторах — непозволительная роскошь.

    • »
      »
      »
      8 лет назад, # ^ |
        Проголосовать: нравится +11 Проголосовать: не нравится

      DmitriyH дело говорит. Пишу в Visual Studio и испытываю неудобства из-за различий компиляторов.

    • »
      »
      »
      8 лет назад, # ^ |
        Проголосовать: нравится +6 Проголосовать: не нравится

      Ага, и кое-что лишнее будет. А именно, баги компилятора. На Codeforces уже миллион постов о багах в g++, а вот на MS C++ пока никто особо не жаловался.

      • »
        »
        »
        »
        8 лет назад, # ^ |
          Проголосовать: нравится +18 Проголосовать: не нравится

        У MS компилятора тоже полно багов, но жалуются меньше, т.к. на codeforces им пользуются реже.

  • »
    »
    8 лет назад, # ^ |
    Rev. 2   Проголосовать: нравится +19 Проголосовать: не нравится

    Поддерживаю. На каждом первом контесте постоянно получаю ошибку компиляции, забывая, что этот компилятор устаревший и не поддерживает for (auto a : b) UPD: совсем забыл про инициализацию pair с помощью {a, b} вместо б-гомерзкой make_pair()!

  • »
    »
    8 лет назад, # ^ |
      Проголосовать: нравится +11 Проголосовать: не нравится

    MS VS C++ 2015!

»
8 лет назад, # |
  Проголосовать: нравится +85 Проголосовать: не нравится

works correctly to read-write long long both with %lld and %I64d

works correctly to read-write long long both with %lld and %I64d

works correctly to read-write long long both with %lld and %I64d

works correctly to read-write long long both with %lld and %I64d

Finally!

»
8 лет назад, # |
Rev. 2   Проголосовать: нравится -67 Проголосовать: не нравится

will xcode be supported at any time in the future /?

UPD : i meant the C++ language that xcode uses ... it's a bit strange from MSVS2010 and C++11 .... i wish that some day xcode will be a language to submit like MSVS

»
8 лет назад, # |
Rev. 2   Проголосовать: нравится -8 Проголосовать: не нравится

Hoora!! so what is g++14?!

What's the different between g++11 & g++14?

  • »
    »
    8 лет назад, # ^ |
    Rev. 2   Проголосовать: нравится +22 Проголосовать: не нравится

    One of the most interesting features in aspect of competitive programming is: auto f(auto i, auto j) { return i < j; }. Now both return type and parameter types are automatically resolved while compiling — it might save some bytes.

»
8 лет назад, # |
  Проголосовать: нравится +17 Проголосовать: не нравится

I'm sorry if this is out of topic, but when did CF completely remove Java 7 ? I recently realized that during contest #366, I submitted A and B using Java 7, and C onwards, Java 8 was the only Java version available..Was Java 7 removed right during the contest ?

»
8 лет назад, # |
  Проголосовать: нравится +5 Проголосовать: не нравится

Wow!!! great news.

»
8 лет назад, # |
Rev. 5   Проголосовать: нравится +91 Проголосовать: не нравится

A word of warning: looks like scanf is much slower on C++14 than it was on C++11. Here are three submissions using almost the same code on a problem:

So if you're using C++14, looks like it may be best to avoid scanf/printf now.

Edit: As pointed out below, a possible workaround is adding "#include <stdio.h>" before all other headers to the code, but this may break other things in the standard library (I don't know exactly what): 20295608

  • »
    »
    8 лет назад, # ^ |
      Проголосовать: нравится +17 Проголосовать: не нравится

    That sounds like a huge disadvantage of a new version, it means that it's not possible to simply replace current compilers for C++98 and C++11 with a new one as it would fail lots of already working solutions. Can anybody using Windows investigate the reason of such slowdown?

  • »
    »
    8 лет назад, # ^ |
      Проголосовать: нравится +11 Проголосовать: не нравится

    I've tried other problem and got these results:

    • »
      »
      »
      8 лет назад, # ^ |
      Rev. 3   Проголосовать: нравится +30 Проголосовать: не нравится

      The reason I chose that specific problem was because the actual computations were extremely simple, so not much could change other than scanf/cin performance.

      Your benchmark is spending the most time in priority_queue operations, so that's what you're really measuring (and it looks like C++14 priority_queue is much faster than C++11 priority_queue).

      As you can see, reading the input of that problem with scanf takes 150ms on C++14 (20294340) and only 50ms on C++11 (20294356)

  • »
    »
    8 лет назад, # ^ |
    Rev. 4   Проголосовать: нравится +40 Проголосовать: не нравится

    20294551 c++14 scanf stdio.h 265ms

    20294631 c++14 scanf cstdio tle

    Is there any reason why this would happen?

    • »
      »
      »
      8 лет назад, # ^ |
        Проголосовать: нравится +24 Проголосовать: не нравится

      Funny stuff!

      As I can see in the mingw-w64 headers, including <cstdio> includes <bits/c++config.h> which includes <bits/os_defines.h> which contains the following code:

      // Make sure that POSIX printf/scanf functions are activated.  As
      // libstdc++ depends on POSIX-definitions of those functions, we define
      // it unconditionally.
      #undef __USE_MINGW_ANSI_STDIO
      #define __USE_MINGW_ANSI_STDIO 1
      

      If this file doesn't get included, it uses MSVCRT implementations of scanf/printf, just like the C++11 compiler.

      • »
        »
        »
        »
        8 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится

        I believe if it's not included, some incompatibilities between between already built libstdc++ and existing code may arise and break something.

      • »
        »
        »
        »
        8 лет назад, # ^ |
          Проголосовать: нравится -10 Проголосовать: не нравится

        Sorry for bothering you but do you have any idea whether this problem still exists if I include <bits/stdc++.h> instead :)) Thanks so much

  • »
    »
    8 лет назад, # ^ |
      Проголосовать: нравится +24 Проголосовать: не нравится

    Some good news for stdio haters :)

»
8 лет назад, # |
Rev. 2   Проголосовать: нравится -22 Проголосовать: не нравится

.

»
8 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

So after half a year...**C++17** will be supported?

»
8 лет назад, # |
  Проголосовать: нравится +34 Проголосовать: не нравится

__int128 is still not supported... Linux g++ supports it and thus it is available in most of online judges including ICPC WF judge.

  • »
    »
    8 лет назад, # ^ |
    Rev. 3   Проголосовать: нравится +18 Проголосовать: не нравится

    mingw-w64 also supports it, but in the 64-bit version (I think Linux g++ only supports it in 64-bits as well, no?). Mike probably installed 32-bit version, which doesn't have __int128.

    I wish we had __int128 here too :c

  • »
    »
    8 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    It's because testing server has 32-bit OS, I think. :(

»
8 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Can anyone help? Where can I get a C++14 for free? Does anyone has a hyperlink leads to the download page?

»
8 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

pbox install mingw-w64: FATAL [2016-08-31 16:20:50,263] Unexpected error: Can't find mingw-w64$6.2.0.pbox.7z for 'mingw-w64$6.2.0'. Are you sure the package exists? java.lang.RuntimeException: Can't find mingw-w64$6.2.0.pbox.7z for 'mingw-w64$6.2.0'. Are you sure the package exists? at me.pbox.command.InstallCommand.run(InstallCommand.java:44) at me.pbox.command.DefaultCommand.run(DefaultCommand.java:21) at me.pbox.Main.main(Main.java:104)

»
8 лет назад, # |
  Проголосовать: нравится +4 Проголосовать: не нравится

20301838: MS C++, scanf, 1559 ms

20301823 : GNU C++11, scanf, 1731 ms

20301815 : GNU C++14, scanf, TLE (time limit 3 seconds)

<cstdio> included

»
8 лет назад, # |
  Проголосовать: нравится +1 Проголосовать: не нравится

Свершилось!!! Спасибо MikeMirzayanov.

»
8 лет назад, # |
  Проголосовать: нравится +3 Проголосовать: не нравится

Those who are using Windows 10 and anniversary update, they will get linux beta version in developer mode. I am not sure about earlier version of windows 10 but this one I have tried. I think this will remove the necessity of CYGWIN or other tools for windows.

How to enable it — Steps to follow — 1) go to settings 2) update and security 3) for developers, click on developer mode

After that- 1) open control panel 2) go to program and features(if you can't find it go to uninstall program) 3) you will see turn features on or off(you can directly search it in cortona or search bar), click on it 4) you will see "window subsystem for linux beta", include the folder and its sub folders and now you have workable linux.

»
8 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Thank you Mike for your work making this feature possible :)

»
8 лет назад, # |
  Проголосовать: нравится -13 Проголосовать: не нравится

»
8 лет назад, # |
  Проголосовать: нравится +2 Проголосовать: не нравится

I'm wondering if this is the first blog, which has +1000 upvotes ?

»
8 лет назад, # |
  Проголосовать: нравится +19 Проголосовать: не нравится

When C++ 14 will appear on Polygon?

»
8 лет назад, # |
  Проголосовать: нравится +13 Проголосовать: не нравится

Не понимаю: в каком смысле сложно обновить C++11 до GCC 6? Надо просто скопировать конфигурацию C++14 и добавить флаг -std=gnu++11.

»
8 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Подскажите, пожалуйста, есть ли страница, где собраны актуальные сведения по списку поддерживаемых компиляторов и используемых флагах?
Ссылку на FAQ не наблюдаю, гуглом ищется Entry #79, но там, к примеру, нет упоминания о GCC 6.2.0.

»
10 месяцев назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

GNU C++ 14 is removed? i used to submit in C++14 but unable to find it in the dropdown options now.