範囲の要素をカウントする count, count_if (C++11/C++20)

C++

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

コメント

タイトルとURLをコピーしました