使用 C++,尝试使用 for 循环和 std::max 查找向量中的最大单词

Posted

技术标签:

【中文标题】使用 C++,尝试使用 for 循环和 std::max 查找向量中的最大单词【英文标题】:Using C++, trying to find the largest word in a vector using a for-loop and std::max 【发布时间】:2020-12-15 04:23:40 【问题描述】:

使用 C++,我正在尝试组合一个 for 循环,以查找字符串向量中的最大单词。我知道通过比较字长可以做到这一点。所以这只是想知道一些细节和学习一些关于 C++ 的东西,我不明白为什么这不起作用:

#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() 并使用它? std::max(string1, string2) 它自己给了我两个字符串中较大的一个。这就是为什么我无法弄清楚为什么循环不起作用的原因。 程序完全按照你写的那样做——那就是得到两个字符串的最大值。对于字符串,最大值由哪个字符串按顺序放置在另一个之后来表示。 max 无处可算出你的意思是字符串的长度,除非你告诉它 你完全正确,我误解了为什么我的小 std::max(string1, string2) 测试有效。这完全是因为这个循环使用了一个向量。谢谢! 【参考方案1】:

std::max 将事物与普通比较进行比较,对于字符串,比较它们的字典顺序,而不是它们的长度。所以你循环中的所有结果都符合预期。

【讨论】:

谢谢!这解释了为什么我的独立 std:max(string1, string2) 测试有效但向量测试无效。【参考方案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 循环好多了。尽管如此,我还是想知道为什么循环不起作用。 'std::max(temp, words[i]);` 合并值而不是字符串长度。

以上是关于使用 C++,尝试使用 for 循环和 std::max 查找向量中的最大单词的主要内容,如果未能解决你的问题,请参考以下文章

计算使用 C++ std 函数而不是 for 循环的大 O

C++ STL应用与实现26: 如何使用std::for_each以及基于范围的for循环 (since C++11)

C++ for 循环:条件评估

C++ OpenMP 并行 For 循环 - std::vector 的替代品 [关闭]

c++ 转换和 lambda - 替换 for 循环

C++ 在 for 循环中使用线程