Jednakost reči

Dve reči su jednake ako imaju isti broj slova i ako se na svim pozicijama nalaze ista slova, bez obzira na velika i mala slova. Napisati funktor case_insensitive_equal koji proverava jednakost dve reči na opisani način. Zatim napisati funkciju:

template <typename ForwardIt1, typename ForwardIt2, typename Compare>
bool all_equal(ForwardIt1 first1, ForwardIt1 last1, ForwardIt2 first2, Compare comp);

koja vraća true ako su svi elementi u opsegu [first1, last1) jednaki odgovarajućim elementima počevši od first2, prema kriterijumu definisanom funktorom comp, a false inače. Pretpostaviti da drugi opseg ima dovoljno elemenata.

Test

#include <iostream>
#include <vector>
#include <string>

namespace matf {

	template <typename ForwardIt1, typename ForwardIt2, typename Compare>
	bool all_equal(ForwardIt1 first1, ForwardIt1 last1, ForwardIt2 first2, Compare comp)
	{
        // Ovde ide vasa implementacija
	}

    // Ovde ide vasa implementacija

} // namespace matf

int main(void)
{

	std::vector<std::string> words1 = { "Hello", "world", "Test" };
	std::vector<std::string> words2 = { "hello", "WORLD", "test" };

	bool are_equal = matf::all_equal(
		words1.begin(), words1.end(),
		words2.begin(),
		matf::case_insensitive_equal()
	);

	std::cout << std::boolalpha;
	std::cout << "All equal (case insensitive): " << are_equal << std::endl; // Output: true

	return 0;
}

Rešenje

main.cpp

#include <iostream>
#include <vector>
#include <string>

namespace matf {

	template <typename ForwardIt1, typename ForwardIt2, typename Compare>
	bool all_equal(ForwardIt1 first1, ForwardIt1 last1, ForwardIt2 first2, Compare comp)
	{
		for (; first1 != last1; ++first1, ++first2) {
			if (!comp(*first1, *first2)) {
				return false;
			}
		}
		return true;
	}

	struct case_insensitive_equal {
		bool operator()(const std::string &a, const std::string &b) const
		{
			if (a.size() != b.size()) {
				return false;
			}

			for (size_t i = 0; i < a.size(); ++i) {
				if (tolower(a[i]) != tolower(b[i])) {
					return false;
				}
			}
			return true;
		}
	};

} // namespace matf

int main(void)
{

	std::vector<std::string> words1 = { "Hello", "world", "Test" };
	std::vector<std::string> words2 = { "hello", "WORLD", "test" };

	bool are_equal = matf::all_equal(
		words1.begin(), words1.end(),
		words2.begin(),
		matf::case_insensitive_equal()
	);

	std::cout << std::boolalpha;
	std::cout << "All equal (case insensitive): " << are_equal << std::endl; // Output: true

	return 0;
}