0

我正在编写一个将随机字符串作为输入的算法。我需要输出遇到的最大长度以及有多少单词具有该特定长度。是的,我知道我可以使用不同的方法,但我想将每个字符串存储在 av[it's length] 中,如果有多个长度相同的字符串,那么我会增加 u[same length],然后只输出这些值。如何检查 v[length] 是否已设置?

抱歉,可能英语不好。

#include <iostream>
#include <vector>
#include <string>

using namespace std;

typedef unsigned short us;
typedef vector<string> vstr;
typedef vector<us> vus;

int main()
{
    string str;
    vstr v;
    vus u(50, 1);
    us len;

    while (cin >> str && str != "0")
    {
        len = str.length();

        //if there is an element set at v[len] then ++u[len] otherwise v[len] = str;
    }

    //bunch of other code

    return 0;
}
4

3 回答 3

3

除非您事先知道任何可能字符串的最大长度,否则这将不起作用。让我们将此最大值称为 X。然后您可以构造一个由 X 个整数组成的向量,初始化为 0,然后使用下标运算符递增您需要的那个。

std::vector<int> counts(X, 0); // X ints, initialized to 0
for (const string str : v) {
    int length = str.size();
    try {
        counts.at(length)++;
    } catch (const std::out_of_range& oor) {
        // Your professor lied to you!
    }
}

我解决这个问题的方法是使用map. 然后,您可以执行以下操作:

std::map<int, int> counts;
for (const string str : v) {
    int length = str.size();
    ++counts[length];
}

如果元素不存在,counts[length] 将在 [length] 处创建元素,如果它已经存在,则将其递增。

于 2013-03-10T21:28:58.363 回答
3

是的,我知道我可以使用不同的方法

老实说,我真的相信你最好采用不同的方法。

您根本不需要长度向量,也不需要地图,也不需要字符串向量,除非您也想显示这些字符串(在这里,我假设您确实需要它)。最后,您甚至不需要知道这些字符串的最大长度:

#include <iostream>
#include <vector>
#include <string>

int main()
{
    std::vector<std::string> words;

    std::string::size_type maxLength = 0;
    std::string str;
    while (std::cin >> str)
    {
        auto len = str.length();
        if (len == maxLength)
        {
            words.push_back(str);
        }
        else if (len > maxLength)
        {
            maxLength = len;

            words.clear();
            words.push_back(str);
        }
    }

    std::cout << "Max length: " << maxLength << std::endl;
    std::cout << "# of words with max length: " << words.size() << std::endl;
    std::cout << "Words with max length: " << std::endl;
    for (auto const& s : words) { std::cout << s << std::endl; }

    return 0;
}
于 2013-03-10T21:38:46.920 回答
0

Astd::vector v的长度由 给出v.size(),并且范围内的所有元素都[0,v.size())存在。

所以一个元素存在于v[n]ifv.size() > n

您可以通过检查向量的长度或访问元素来测试它,v.at(n)而不是v[n]因为at()如果元素不存在(即,如果长度不是至少n)该函数将引发异常

事实上 astd::vector在每个索引处都包含一个元素,直到它的长度意味着它不是稀疏数组的有效表示要使用标准容器之一表示稀疏数组,最好使用std::map它,因为它不需要元素具有连续性键。

于 2013-03-10T21:37:36.287 回答