отключен.

й книге cs106b мы используем выражение «foreach», чтобы просмотреть список слов на карте. Я реализовал код и ударил головой о стену, столкнувшись с загадочными ошибками. Вот код:

   void DisplayWordCounts(Map<int> & wordsCount) {
     foreach (string word in wordsCount) {
        cout << left << setw(15) << word << right << setw(5)
        << wordsCount[word] << endl;
     }
}

в строке, начинающейся с «foreach», я получаю следующие ошибки: lesson4-macbeth / life.cpp: 58: ошибка: ожидаемое первичное выражение перед «словом» lesson4-macbeth / life.cpp: 58: ошибка: «foreach» был не объявлено в этой области lesson4-macbeth / life.cpp: 58: ошибка: ожидается `; ' перед знаком "{"

Я думаю, что foreach не признается. В таком случае, как я могу просмотреть список элементов из класса Map?

 Gene Bushuyev22 янв. 2011 г., 00:23
Вы пытаетесь скомпилировать код C # в C ++?
 jmucchiello22 янв. 2011 г., 00:23
Пожалуйста, сообщите нам название этой книги, чтобы мы лучше ее избегали.
 wkl22 янв. 2011 г., 00:29
@templatetypedef - спасибо за разъяснения. В этом случае этот вопрос кажется слишком локализованным, поскольку он настолько специфичен для учебного плана.
 templatetypedef22 янв. 2011 г., 00:27
@ Everyone- Это специальный макрос, который предоставляется на вводных курсах программирования Стэнфорда CS106B и CS106X. Мы также предоставляем заказMap класс, который проще в использовании, чем STLmap; отсюда и заглавные буквы
 Clifford22 янв. 2011 г., 00:42
Вы должны подвергнуть сомнению мудрость синтеза конструкции, которая не существует в языке, не давая понять студенту, что он не изучает C ++, но некоторую конструкцию придумали для обучения программированию в более абстрактном смысле. Кроме того, поскольку конструкция кажется скопированной непосредственно из C #, что не так с использованием C # для этого курса?

Ответы на вопрос(9)

струкция foreach имеет синтаксис C #, C ++ / CLI (поддерживаемый VC ++) имеет для каждой конструкции, как и C ++ 0x (поддерживается GCC 4.6), но ни один из них не следует этому синтаксису.

Решение Вопроса

foreach не является стандартной функцией C ++. Я на самом деле помог Эрику Робертсу собрать реализацию для CS106B / X, и вы сможете использовать ее, если вы#include "foreach.h", Если вам интересно, я могу попробовать отправить вам исходный код файла.

Также реквизит для поиска переполнения стека! Хотя ваш SL, вероятно, должен быть вашей первой линией защиты. :-)

 Oliver Charlesworth22 янв. 2011 г., 00:34
Мне любопытно. Что было не так со стандартной конструкцией C ++?
 Oliver Charlesworth22 янв. 2011 г., 00:50
C ++ был интересным выбором для обучения структурам данных, в то же время пытаясь игнорировать специфичные для языка детали!
 templatetypedef22 янв. 2011 г., 00:36
@ Оли Чарльзуорт: В C ++ не было ничего плохого как такового. Основным преимуществом была простота - гораздо проще сосредоточиться на более сложных идеях, таких как рекурсия, связанные списки, графики и асимптотический анализ, если вам не нужно вводить сложный синтаксис итератора для просмотра всего в карте / наборе / и т. Д. Учебная программа, вероятно, скоро будет обновлена, чтобы в конце курса пройтись по контейнерам STL, что означает, чтоforeach скорее всего, будут «учебные колеса» для упрощения материала.
 templatetypedef22 янв. 2011 г., 00:40
@ Clifford. Цель этих курсов - научить студентов осваивать не зависящие от языка понятия, такие как рекурсия, структуры данных, наследование и т. Д., А не создавать жестких программистов на C ++. Существуют и другие курсы, посвященные специфике C ++ и других языков программирования. Исходя из опыта, эта схема на самом деле работает довольно хорошо, поскольку студенты обычно берут на себя обязательство выучить нюансы своих любимых языков. Я бы предпочел не вступать в спор об этом, поскольку я не думаю, что кто-то изменит свое мнение, но у вас есть очень хорошая точка зрения.
 Clifford22 янв. 2011 г., 00:51
@templatetypedef: Я это понимаю, но этот студент не хочет, чтобы это было ясноегои думает, что он изучает C ++. Раньше я регулярно посещал форум, где подобные проблемы возникали постоянно с американскими студентами, которые изучали C ++ по программе AP Computer Science; некоторые из них, казалось, добрались до рабочего места, прежде чем узнали, что библиотеки классов, которые они изучили, были недоступны вне ацидемии.

for_each Постскриптум Я подумал, что это вопрос c ++, как и предполагал тег, но синтаксис для C ++ неверен.

 Oliver Charlesworth22 янв. 2011 г., 00:21
Ну, это так. Но вы не можете использовать это так.

Попробуйте перебрать размер карты.

for(int i=0;i<MAP.size();++i)
    // something with MAP.at(i);

Замените MAP вашим объектом карты.

Удачи!

С Уважением,
Деннис М.

 Lightness Races in Orbit22 янв. 2011 г., 01:24
Карты не индексируются таким образом. Используйте итератор.
 Clifford22 янв. 2011 г., 01:18
Использование итератора было бы ближе к конструкции foreach, хотя синтаксис, возможно, несколько громоздок.

не конструкция в C ++!

В последней версии C ++, которая только что выпущена в некоторых последних компиляторах, вы можете использовать «Range-based for-loop» .. найдите его на этой странице:http://en.wikipedia.org/wiki/C%2B%2B0x

Я сомневаюсь, что ваш компилятор это поддерживает. Так что, возможно, придерживайтесь цикла for.

foreach не является ключевым словом C ++, и я думаю, что самое близкое расширение, которое вводит его с этим конкретным синтаксисом в язык, находится в Visual C ++, как описано в этой ссылке:http://blogs.msdn.com/b/arich/archive/2004/09/08/227139.aspx

Естьfor_each в<algorithm>, но его подпись сильно отличается от того, что вы используете (это очень синтаксис Java для каждого).

Также я заметил, что вы используетеMap который отличается отstd::map?

Qt это поддержкаforeach, используя как это:

QDir dir("Dir");
dir=QFileDialog::getExistingDirectory(0,"Select Folder: ");
QFileInfoList list = dir.entryInfoList(QDir::Dirs| QDir::Files | QDir::NoDotAndDotDot);

std::vector<std::string> names;
foreach(QFileInfo finfo, list){
    std::string str=dir.path().toStdString().c_str();
    str=str+"/";
    names.push_back(str+finfo.fileName().toStdString().c_str());
}

но, когда вы используете#define QT_NO_KEYWORDS в заголовочном файле,foreach отключен.

Ваш ответ на вопрос