是的,有一种更有效的方法来完成此类任务,即使用地图,更准确地说是 std::map。
进行计数的算法是:
- 用
map<dataDesired, int> itemRepetitions创建地图
- 遍历项目向量
- 增加 itemRepetitions[itemInVector]
假设我们有一个vector<string> called items;
要计算每个项目的重复次数,我们只需要执行以下操作
std::vector<std::string> items { "ja", "an", "di", "ja", "ja", "an", "di", "be" };
std::map<std::string, int> itemsCount;
for (std::string item : items)
{
++itemsCount[item];
}
//print the map
for (auto item : itemsCount)
std::cout << "Value: " << item.first << " repetitions: " << item.second << std::endl;
输出:
Value: an repetitions: 2
Value: be repetitions: 1
Value: di repetitions: 2
Value: ja repetitions: 3
如果你想让它更“通用/全局”,你可以像往常一样创建一个模板函数来计算任何类型向量上的元素
template <class datatype>
std::map<datatype, int> count_elements_in(std::vector<datatype> items)
{
std::map<datatype, int> itemsCount;
for (datatype item : items)
++itemsCount[item];
return itemsCount;
}
此函数返回接收到的类型的映射,其中作为参数传递的向量中的值重复,向量可以是任何类型。让我们试试吧:
std::vector<std::string> itemsStr{ "ja", "an", "di", "ja", "ja", "an", "di", "be" };
std::vector<int> itemsInt{ 1, 2, 8, 4 , 1, 1, 2, 3, 3, 3 };
std::vector<double> itemsDouble{ 1.2, 2.1, 8.3, 4 , 1.2, 1.2, 2.1, 3.6, 3.6, 3.6 };
std::map<std::string, int> itemsCountStr = count_elements_in(itemsStr);
std::map<int, int> itemsCountInt = count_elements_in(itemsInt);
std::map<double, int> itemsCountDouble = count_elements_in(itemsDouble);
如果我们打印 itemsCounts,我们将得到以下输出:
strings count:
Value: an repetitions: 2
Value: be repetitions: 1
Value: di repetitions: 2
Value: ja repetitions: 3
ints count:
Value: 1 repetitions: 3
Value: 2 repetitions: 2
Value: 3 repetitions: 3
Value: 4 repetitions: 1
Value: 8 repetitions: 1
floats count:
Value: 1.2 repetitions: 3
Value: 2.1 repetitions: 2
Value: 3.6 repetitions: 3
Value: 4 repetitions: 1
Value: 8.3 repetitions: 1
通过这个我们可以知道每个项目在给定容器(如向量)中重复了多少次。
我提出了这个问题并回答了,因为我注意到在大多数与他的任务相关的帖子中,人们倾向于执行前面解释过的双循环算法,而不是使用 C++ 语言的特性,我知道这可能不是完成这项任务的最有效方法,但比双循环算法更优化。