C++11/C++20 の count, count_if 関数について調べました。
count: 範囲の値が一致する要素数
count_if: 範囲の条件を満たす要素数
使用しないで実装した例
#include <iostream>
#include <vector>
int main(int argc, char* argv[]) {
std::cout << "// 範囲カウント" << std::endl;
std::vector<int> v = { 1, 2, 3, 4, 5 };
std::cout << "std::vector<int> v = [0, " << v.size() << "): ";
for (const auto& x : v) { std::cout << x << (&x != &v.back() ? ", " : "\n"); }
std::cout << "// 条件を満たす要素数" << std::endl;
int count_if = 0;
for (int i = 0; i < v.size(); ++i) {
if (v[i] >= 3) {
++count_if;
}
}
std::cout << "> count_if = " << count_if << std::endl;
}
// 範囲カウント
std::vector<int> v = [0, 5): 1, 2, 3, 4, 5
// 条件を満たす要素数
> count_if = 3
std::count, std::count_if (C++11)
第1,2引数に指定した範囲をチェックします。第3引数には比較する値または比較関数を渡します。
#include <algorithm>
#include <iostream>
#include <vector>
int main(int argc, char* argv[]) {
std::cout << "// 範囲カウント" << std::endl;
std::vector<int> v = { 1, 2, 3, 4, 5 };
std::cout << "std::vector<int> v = [0, " << v.size() << "): ";
for (const auto& x : v) { std::cout << x << (&x != &v.back() ? ", " : "\n"); }
std::cout << "// 値が一致する要素数" << std::endl;
std::cout << "std::count(v.begin(), v.end(), 3);" << std::endl;
std::cout << "> " << std::count(v.begin(), v.end(), 3) << std::endl;
std::cout << "// 条件を満たす要素数" << std::endl;
std::cout << "std::count_if(v.begin(), v.end(), [](int x) { return x >= 3; });" << std::endl;
std::cout << "> " << std::count_if(v.begin(), v.end(), [](int x) { return x >= 3; }) << std::endl;
}
// 範囲カウント
std::vector<int> v = [0, 5): 1, 2, 3, 4, 5
// 値が一致する要素数
std::count(v.begin(), v.end(), 3);
> 1
// 条件を満たす要素数
std::count_if(v.begin(), v.end(), [](int x) { return x >= 3; });
> 3
std::ranges::count, std::ranges::count_if (C++20)
ranges の関数は第1引数に指定した範囲をチェックします。第2引数には比較する値または比較関数を渡します。
第1,2引数に範囲を指定するバージョンも用意されています。
#include <algorithm>
#include <iostream>
#include <vector>
int main(int argc, char* argv[]) {
std::cout << "// 範囲カウント" << std::endl;
std::vector<int> v = { 1, 2, 3, 4, 5 };
std::cout << "std::vector<int> v = [0, " << v.size() << "): ";
for (const auto& x : v) { std::cout << x << (&x != &v.back() ? ", " : "\n"); }
std::cout << std::endl;
std::cout << "// 第1引数に範囲を指定" << std::endl;
std::cout << "// 値が一致する要素数" << std::endl;
std::cout << "std::ranges::count(v, 3);" << std::endl;
std::cout << "> " << std::ranges::count(v, 3) << std::endl;
std::cout << "// 条件を満たす要素数" << std::endl;
std::cout << "std::ranges::count_if(v, [](int x) { return x >= 3; });" << std::endl;
std::cout << "> " << std::ranges::count_if(v, [](int x) { return x >= 3; }) << std::endl;
std::cout << std::endl;
std::cout << "// 第1,2引数に範囲を指定" << std::endl;
std::cout << "// 値が一致する要素数" << std::endl;
std::cout << "std::ranges::count(v.begin(), v.end(), 3);" << std::endl;
std::cout << "> " << std::ranges::count(v.begin(), v.end(), 3) << std::endl;
std::cout << "// 条件を満たす要素数" << std::endl;
std::cout << "std::ranges::count_if(v.begin(), v.end(), [](int x) { return x >= 3; });" << std::endl;
std::cout << "> " << std::ranges::count_if(v.begin(), v.end(), [](int x) { return x >= 3; }) << std::endl;
}
// 範囲カウント
std::vector<int> v = [0, 5): 1, 2, 3, 4, 5
// 第1引数に範囲を指定
// 値が一致する要素数
std::ranges::count(v, 3);
> 1
// 条件を満たす要素数
std::ranges::count_if(v, [](int x) { return x >= 3; });
> 3
// 第1,2引数に範囲を指定
// 値が一致する要素数
std::ranges::count(v.begin(), v.end(), 3);
> 1
// 条件を満たす要素数
std::ranges::count_if(v.begin(), v.end(), [](int x) { return x >= 3; });
> 3
サポートするコレクション
vector, list, map などの STL コレクション、配列をサポートします。
#include <algorithm>
#include <iostream>
#include <list>
#include <map>
int main(int argc, char* argv[]) {
{
// C++11
int a[] = { 1, 2, 3, 4, 5 };
std::cout << "> " << std::count_if(a, a + 5, [](int x) { return x >= 3; }) << std::endl;
std::list<int> l = { 1, 2, 3, 4, 5 };
std::cout << "> " << std::count_if(l.begin(), l.end(), [](int x) { return x >= 3; }) << std::endl;
std::map<int, std::string> m = { {1, "aaa"}, {2, "bbb"}, {3, "ccc"}, {4, "ddd"}, {5, "eee"} };
std::cout << "> " << std::count_if(m.begin(), m.end(), [](const auto& x) { return x.first >= 3; }) << std::endl;
}
{
// C++20
int a[] = { 1, 2, 3, 4, 5 };
std::cout << "> " << std::ranges::count_if(a, [](int x) { return x >= 3; }) << std::endl;
std::list<int> l = { 1, 2, 3, 4, 5 };
std::cout << "> " << std::ranges::count_if(l, [](int x) { return x >= 3; }) << std::endl;
std::map<int, std::string> m = { {1, "aaa"}, {2, "bbb"}, {3, "ccc"}, {4, "ddd"}, {5, "eee"} };
std::cout << "> " << std::ranges::count_if(m, [](const auto& x) { return x.first >= 3; }) << std::endl;
}
}
コメント