#pragma once #include <vector> #include <string> #include <algorithm> #include <iterator> namespace jlib { /** * @brief check if Container contains ElementType t * @note C must be a container of type T */ template <class Container, class ElementType> inline bool is_contain(const Container& c, const ElementType& t) { for (const auto& i : c) { if (i == t) { return true; } } return false; } /** * @brief Sub 是 All 的子集,返回 All 内 Sub 的补集 * @note All 和 Sub 必须为同样类型的容器(不支持initializer-list) */ template <class Container> Container get_other(const Container& All, const Container& Sub) { Container res, tmp; std::copy(Sub.begin(), Sub.end(), std::back_inserter(tmp)); for (const auto& i : All) { bool in_Sub = false; for (auto iter = tmp.begin(); iter != tmp.end(); iter++) { if (*iter == i) { tmp.erase(iter); in_Sub = true; break; } } if (!in_Sub) { res.push_back(i); } } return res; } /** * @brief t 是 v 的子集,返回 v 内 t 的补集 */ template <class V> std::vector<std::wstring> get_other(const V& v, const std::wstring& t) { std::vector<std::wstring> ret = {}; for (const auto& i : v) { if (i != t) { ret.push_back(i); } } return ret; } /** * @brief t 是 v 的子集,返回 v 内 t 的补集 */ template <class V> std::vector<std::string> get_other(const V& v, const std::string& t) { std::vector<std::string> ret = {}; for (const auto& i : v) { if (i != t) { ret.push_back(i); } } return ret; } }