Пожалуйста, имейте в виду, что я чрезвычайно новичок в C ++, поэтому предпочтение отдается наиболее прямому / простому решению (в идеале с объяснением).
У меня есть три вопроса об этом коде, которые я буквально скопировал из Страуструпа «Программирование: принципы и практика».
Вот код:
#include "std_lib_facilities.h" //using this header as it is what the book recommends
int main()
{
vector<string> words;
for (string temp; cin >> temp;)
words.push_back(temp);
cout << "Number of words: " << words.size() << "\n";
sort(words); //"no instance of overloaded function "sort" matches the argument list"
for (int i = 0; i<words.size(); ++i) //'<' : signed/unsigned mismatch -- exe still runs in spite of this, not sure what it means
if (i == 0 || words[i-1]!= words[i])
cout << words[i] << "\n";
keep_window_open(); //added because i don't know how else to keep the window open
}
Я получаю две ошибки относительно алгоритма sort ():
"error C2780: 'void std::sort(_RanIt,_RanIt)' : expects 2 arguments - 1 provided"
"error C2780: 'void std::sort(_RanIt,_RanIt,_Pr)' : expects 3 arguments - 1 provided"
Я искал оба из них онлайн, но не нашел ответа, который имеет смысл для меня.
Во-вторых, мне интересно
'<' : signed/unsigned mismatch
потому что это не останавливает программу от запуска. Если ответ на этот вопрос слишком сложен для новичка, не стесняйтесь его пропустить, мне просто интересно.
Я бы предложил проверить, с чем связан Иоахим и http://www.cplusplus.com/reference/algorithm/sort/. При вызове sort вы должны предоставить ему итератор для начала и итератор до конца с необязательным третьим аргументом, который может быть вашим оператором сравнения.
Ниже приведен пример, который я сделал из вашего кода;
#include "std_lib_facilities.h" //using this header as it is what the book recommends
int main()
{
vector<string> words;
for (string temp; cin >> temp;)
words.push_back(temp);
cout << "Number of words: " << words.size() << "\n";
sort(words.begin(),words.end()); //beginning and ending of where you want to sort
for (uint i = 0; i<words.size(); ++i) //'<' : //changed int to uint
if (i == 0 || words[i-1]!= words[i])
cout << words[i] << "\n";
keep_window_open(); //added because i don't know how else to keep the window open
}
Что касается ошибки со знаком / без знака, целые числа являются знаковыми, что означает, что они могут быть отрицательными, поэтому они могут иметь значение от -32 768 до 32 767, где в качестве uints указываются без знака, что означает, что они могут быть от 0 до 65 535.
Код все еще может работать, но имейте в виду, что если word.size () больше 32767, и я являюсь int, то я никогда не вырасту до размера больше word.size (). я просто оберну вокруг -32768 при увеличении после 32767. Я бы предложил использовать uint в качестве типа i.