Используя C++, я пытаюсь собрать цикл for, который находит самое большое слово в векторе строк. Я знаю, что это можно сделать, сравнив длину слов. Так что это просто интересно узнать о некоторых мелочах и узнать кое-что о С++, я не могу понять, почему это не сработает:
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::string test = "this is a test string for sentence length ranks";
std::vector<std::string> words = {"this", "is", "a", "test", "string",
"for", "sentence", "length", "ranks"};
std::string temp = "";
std::string largest = "";
for (int i = 0; i != words.size(); ++i) {
std::cout << "words[" << i << "]: " << words[i] << " ";
std:: cout << std::endl;
temp = std::max(temp, words[i]);
largest = std::max(temp, largest);
std::cout << "the biggest word is " << largest << std::endl;
}
return 0;
}
Он возвращает это:
Обновлять:
Ответы здесь помогли указать мне правильное направление. Как оказалось, в std::max есть еще одна функция, называемая «comp». Я едва понимаю это, но это, кажется, работает:
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::string test = "this is a test string for sentence length ranks";
std::vector<std::string> words = {"this", "is", "a", "test", "string",
"for", "sentence", "length", "ranks"};
std::string tempword;
std::string longword;
int longwordint = 0;
for (int i = 0; i != words.size(); ++i) {
int wordlength = words[i].length();
longwordint = std::max(longwordint, wordlength);
tempword = words[i];
longword = std::max(longword, tempword,
[](std::string longword, std::string tempword)
{ return (longword.size() < tempword.size()); });
std::cout << "the biggest word so far is " << longwordint;
std::cout <<" letters long: " << longword;
std::cout << " | the tempword is: " << tempword << std::endl;
}
return 0;
}
std::max(string1, string2) сам по себе дает мне большую из двух строк. Вот почему я не могу понять, почему цикл не работает.
Программа сделала именно так, как вы написали, и получила максимум две строки. Для строк максимум обозначается тем, какая строка располагается по порядку после другой. Нигде max
не поймет, что вы действительно имеете в виду длину строки, если вы не скажете об этом.
Вы совершенно правы, я неправильно понял, почему мои маленькие тесты std::max(string1, string2) работали. Все потому, что этот цикл использует вектор. Спасибо!
Вы можете использовать std::max_element
, чтобы найти самое большое слово в векторной строке.
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::string test = "this is a test string for sentence length ranks";
std::vector<std::string> words = {"this", "is", "a", "test", "string",
"for", "sentence", "length", "ranks"};
auto largest = std::max_element(words.begin(), words.end(), [](const auto& s1, const auto& s2){
return s1.size() < s2.size();
});
std::cout << "the biggest word is " << *largest << std::endl;
return 0;
}
спасибо, это намного лучше, чем цикл for. тем не менее, я хотел бы знать, почему цикл не работает.
'std::max(temp, words[i]);` сопоставляет значения, а не длину строки.
std::max сравнивает вещи с обычным сравнением, которое для строк сравнивает их порядок в словаре, а не их длину. Итак, все результаты в вашем цикле соответствуют ожиданиям.
Спасибо! Это объясняет, почему мои автономные тесты std:max(string1, string2) работали, а векторный тест — нет.
Нет необходимости писать цикл. Вы могли бы просто использовать std::max_element. Кроме того, где вы на самом деле берете
size()
каждого слова и используете его?