【问题标题】:Why is it that my code is only showing the last element in the array even though It should be showing the element with the most amount of characters为什么我的代码只显示数组中的最后一个元素,即使它应该显示具有最多字符的元素
【发布时间】:2022-01-08 11:49:48
【问题描述】:
#include <iostream>
#include <vector>
#include <ctime>
using namespace std;

vector<string> createvector() {
    vector<string> words;
    string names;
    cout << "Please enter 5 different words: " << endl;
    for (int i = 0; i < 5; i++) {
        cin >> names;
        words.push_back(names);
    }
    return (words);
}
void mostchar(vector<string> words) {
    string w1 = words[0];
    string largestword;
    for (int i = 1; i < 5; i++) {
        if (words[i] > w1) {
            largestword = words[i];
        }
    }
    cout << "The largest word is: " << largestword;
}

int main()
{
    vector<string> words;
    string names;
    words = createvector();
    mostchar(words);
}

我不明白为什么每次都选择最后一个元素或倒数第二个元素。是的,我试图改变 for(int i = 1; i

【问题讨论】:

  • &gt; 运算符不比较字符串长度。它是比较值(用于订购)。要比较长度,请使用 .size().length()
  • words[i] &gt; w1 总是与 words[0] 比较。

标签: c++ string algorithm vector max


【解决方案1】:

对于初学者,您是按字典顺序比较字符串。

if (words[i] > w1) {

其次,你总是与数组的第一个元素中的单词进行比较

if (words[i] > w1) {

并且变量w1 不会在循环内更改。因此,向量中大于w1 的任何最后一个元素都将分配给变量largestword

使用 for 循环,函数可以如下所示

void mostchar( const std::vector<std::string> &words ) 
{
    size_t largestword = 0;

    for ( size_t i = 1; i < words.size(); i++ ) 
    {
        if ( words[largestword].size() < words[i].size() ) 
        {
            largestword = i;
        }
    }

    if ( largestword != words.size() )
    {
        std::cout << "The largest word is: " << words[largestword] << '\n';
    }
}

请注意,在一般情况下,用户可以将空向量传递给函数。您必须在函数中检查这种可能性。

请记住,可以使用标准算法 std::max_element 代替手动编写的 for 循环。

例如

#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>

void mostchar( const std::vector<std::string> &words ) 
{
    auto largestword = std::max_element( std::begin( words ), std::end( words ),
                                         []( const auto &a, const auto &b )
                                         {
                                             return a.size() < b.size();
                                         } );

    if ( largestword != std::end( words ) )
    {
        std::cout << "The largest word is: " << *largestword << '\n';
    }
}

【讨论】:

    【解决方案2】:

    这里有几个问题:

    1:你应该使用类似.length()的东西来比较“长度”

    2:您每次都将数组中的下一个单词与words[0] 进行比较。

    编辑:为了进一步解释这一点,分配了string w1 = words[0];。然后在for 循环中的if 中使用w1

    string w1 = words[0];
    string largestword;
    for (int i = 1; i < 5; i++) {
        if (words[i] > w1) {
            largestword = words[i];
        }
    }
    

    导致words[0]的值是循环中反复比较的值。

    将比较行调整为if (words[i].length() &gt; largestword.length()),这两个问题都解决了。您也可以完全通过这种方式消除w1

    #include <iostream>
    #include <vector>
    #include <ctime>
    using namespace std;
    
    vector<string> createvector() {
        vector<string> words;
        string names;
        cout << "Please enter 5 different words: " << endl;
        for (int i = 0; i < 5; i++) {
            cin >> names;
            words.push_back(names);
        }
        return (words);
    }
    void mostchar(vector<string> words) {
        string largestword;
        for (int i = 0; i < 5; i++) {
            if (words[i].length() > largestword.length()) {
                largestword = words[i];
            }
        }
        cout << "The largest word is: " << largestword;
    }
    
    int main()
    {
        vector<string> words;
        string names;
        words = createvector();
        mostchar(words);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-15
      • 1970-01-01
      • 2020-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多