Используя С++, пытаясь найти самое большое слово в векторе, используя цикл for и std::max

Используя 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_element. Кроме того, где вы на самом деле берете size() каждого слова и используете его?

PaulMcKenzie 15.12.2020 05:38

std::max(string1, string2) сам по себе дает мне большую из двух строк. Вот почему я не могу понять, почему цикл не работает.

user1026169 15.12.2020 05:53

Программа сделала именно так, как вы написали, и получила максимум две строки. Для строк максимум обозначается тем, какая строка располагается по порядку после другой. Нигде max не поймет, что вы действительно имеете в виду длину строки, если вы не скажете об этом.

PaulMcKenzie 15.12.2020 05:58

Вы совершенно правы, я неправильно понял, почему мои маленькие тесты std::max(string1, string2) работали. Все потому, что этот цикл использует вектор. Спасибо!

user1026169 15.12.2020 06:02
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
305
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете использовать 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. тем не менее, я хотел бы знать, почему цикл не работает.

user1026169 15.12.2020 05:54

'std::max(temp, words[i]);` сопоставляет значения, а не длину строки.

Villance 15.12.2020 06:17
Ответ принят как подходящий

std::max сравнивает вещи с обычным сравнением, которое для строк сравнивает их порядок в словаре, а не их длину. Итак, все результаты в вашем цикле соответствуют ожиданиям.

Спасибо! Это объясняет, почему мои автономные тесты std:max(string1, string2) работали, а векторный тест — нет.

user1026169 15.12.2020 05:56

Другие вопросы по теме