我正在编写一个以随机字符串作为输入的算法。我需要输出遇到的最大长度以及有多少单词具有该特定长度。是的,我知道我可以使用不同的方法,但我想将每个字符串存储在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;
}
答案 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
因为它不需要元素具有连续的键。