检查STL向量中是否存在(设置)某个位置的元素

时间:2013-03-10 21:24:22

标签: c++ vector stl

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

抱歉可能是英语不好。

#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;
}

3 个答案:

答案 0 :(得分:3)

除非您事先知道任何可能字符串的最大长度,否则这将无效。让我们调用这个最大值X.然后你可以构造一个X int的向量,初始化为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];
}

count [length]将在[length]处创建元素(如果它已经不存在),并且如果它已经存在则会增加它。

答案 1 :(得分: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;
}

答案 2 :(得分:0)

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

如果v[n]

,则v.size() > n处存在一个元素

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

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