Ошибка компиляции. Конструктор `std :: list & lt; int & gt; :: iterator` является private [duplicate]

Существующие решения предлагают либо одну, либо другую:

  • Быстрее, чем O (n * m).
  • Сохранять порядок ввода списка.

Но пока ни одно решение не имеет. Если вы хотите обоим, попробуйте следующее:

s = set(temp2)
temp3 = [x for x in temp1 if x not in s]

Тест производительности

import timeit
init = 'temp1 = list(range(100)); temp2 = [i * 2 for i in range(50)]'
print timeit.timeit('list(set(temp1) - set(temp2))', init, number = 100000)
print timeit.timeit('s = set(temp2);[x for x in temp1 if x not in s]', init, number = 100000)
print timeit.timeit('[item for item in temp1 if item not in temp2]', init, number = 100000)

Результаты:

4.34620224079 # ars' answer
4.2770634955  # This answer
30.7715615392 # matt b's answer

Метод, который я представил, а также сохранение порядок также (немного) быстрее, чем заданное вычитание, потому что он не требует построения ненужного набора. Разница в производительности будет более заметной, если первый список значительно длиннее второго, и если хеширование дорого. Вот второй тест, демонстрирующий это:

init = '''
temp1 = [str(i) for i in range(100000)]
temp2 = [str(i * 2) for i in range(50)]
'''

Результаты:

11.3836875916 # ars' answer
3.63890368748 # this answer (3 times faster!)
37.7445402279 # matt b's answer
49
задан ryan 3 November 2013 в 07:33
поделиться

5 ответов

Это уже давно. «GCC», который пришел с 10.8, был действительно GCC-интерфейсом с back-end LLVM.

Лучший способ получить GCC - через Homebrew . После однострочной команды установки homebrew в нижней части связанной страницы вам просто нужно:

$ brew install gcc49

В отличие от macports, Homebrew не загромождает ваши системные диски, и это намного лучше при управлении версиями и удалением , Он также не требует костыля, известного как sudo.

66
ответ дан Adam 22 August 2018 в 06:23
поделиться
  • 1
    Ваши заявления о макропортах вводят в заблуждение и не относятся к теме. – trojanfoe 23 October 2013 в 08:59
  • 2
    Для кого-то интересно, brew tap homebrew/versions является обязательным условием для brew install gcc49 – Bede Constantinides 31 October 2013 в 21:39
  • 3
    @trojanfoe тупые и немного средние, конечно. Но как это вводит в заблуждение? Это, безусловно, по теме; OP явно ищет лучший способ получить GCC и подразумевает, что все менеджеры пакетов точно так же будут вводить в заблуждение. – Adam 31 October 2013 в 23:14
  • 4
    Это вводит в заблуждение, поскольку это неверно; homebrew вызывает больше сбоев системы и имеет намного меньше портов. Я предложил macports, и вы предложили homebrew, и это нормально, и так оно и должно стоять. Дело субъективно, и аргумент, который мы собираемся сделать, делает его вне темы. – trojanfoe 31 October 2013 в 23:18
  • 5
    @Eddy значением по умолчанию для GCC Homebrew является g++-49. Вы можете изменить это, добавив псевдоним Bash или символическую ссылку в / usr / local / bin. Этот каталог должен уже отображаться первым в вашем $PATH, поэтому symlink должен переопределять значение по умолчанию g++, не изменяя исходные файлы OSX. – Adam 24 February 2014 в 08:35

Это по дизайну, а не нова в OS X 10.9. Apple давно отказалась от GCC. Просто используйте Clang, или если вам нужен fortran / openmp / ..., установите GCC самостоятельно через homebrew / macports /...

1
ответ дан rubenvb 22 August 2018 в 06:23
поделиться
  • 1
    Вы найдете разницу между не поддерживающим GCC и masquerading clang как gcc. – deadalnix 11 November 2013 в 23:10
  • 2
    Они совсем другие - многие существующие кодовые базы не компилируются в Clang, где они отлично работали в gcc / g ++. – Desty 6 January 2015 в 11:56
  • 3
    – Alex Petrosyan 10 September 2018 в 14:33

Вам нужно будет установить его из macports :

$ sudo port install gcc49

Однако я не уверен, как вы интегрировали gcc в Xcode 5, однако вы не Не упоминайте, почему вы не можете использовать clang?

11
ответ дан trojanfoe 22 August 2018 в 06:23
поделиться
  • 1
    @rholt Итак, вы использовали ту же версию gcc? Я подозреваю, что нет. – trojanfoe 23 October 2013 в 08:46
  • 2
    @rholt Я так не думаю; ваша мотивация заключается в том, что ваша работа компилируется во время экзамена и для этого вам нужно будет использовать точную версию всего на обеих системах (и обе системы должны быть одной и той же платформой). Поэтому вы можете использовать clang, если вы не можете воспроизвести его полностью. – trojanfoe 23 October 2013 в 08:52
  • 3
    я не могу использовать clang, потому что мой код зависит от GNU gcc-расширений, таких как встроенные функции ... clang бросает тонны ошибок – Michael 8 December 2013 в 23:00
  • 4
    Это не работает для меня. Я установил gcc48 из macports, но gcc все еще указывает на clang in terminal. – Justin 17 January 2014 в 05:37
  • 5
    @Justin Похоже, вы не настроили $PATH, конфигурация которого является частью процесса установки macports. – trojanfoe 17 January 2014 в 08:27

Доступные и обновленные пакеты GCC находятся в http://hpc.sourceforge.net/

4
ответ дан user2962717 22 August 2018 в 06:23
поделиться
  • 1
    Я просто понял, что ваш ответ был таким же, как тот, который я собирался опубликовать. В любом случае позвольте мне добавить еще несколько направлений. Загрузите их пакет и следуйте их указаниям. После установки в / usr / local / bin вы можете отредактировать переменную PATH и добавить / usr / local / bin в начало PATH. Это гарантирует, что при вызове gcc или g ++ вы на самом деле вызываете правильный, а не устаревший компилятор Mac. Примечание. Этот шаг важен только в том случае, если у вас есть компилятор g ++ в каталоге / usr / bin. Я делаю, так как этот компьютер имел 10,5 изначально. – Zachary Kraus 23 September 2014 в 05:07

вы также можете получить компилятор g ++ из http://hpc.sourceforge.net/ . У них есть компилятор в готовом пакете. Просто загрузите и следуйте их указаниям. Обратите внимание, что вам может потребоваться изменить исполняемый файл PATH и / usr / local / bin перед / usr / bin. Это значит, что g ++ вызывает правильный компилятор.

3
ответ дан Zachary Kraus 22 August 2018 в 06:23
поделиться
  • 1
    Просто из любопытства, почему это было проголосовано? Сообщение объясняет, как получить альтернативную версию компилятора g ++ и изменить настройки системы, чтобы g ++ больше не вызывал компилятор Clang C ++. Разве это не то, что спрашивал оригинальный плакат? – Zachary Kraus 27 July 2015 в 00:38
Другие вопросы по тегам:

Похожие вопросы: