(C++)用于检查对象是否在vector/array/list/...中的模板?

mus*_*tze 0 c++ arrays stl vector c++11

是否有可能在C创建的模板++(11),用于一个函数来检查对象是否包含在任何一个std::vector,std::arraystd::list(以及可能甚至更多的容器类型)?

我现在有什么:

typedef std::shared_ptr<Tag> SharedTag;
typedef std::vector<SharedTag> TagList;

bool
Tag::isIn(const TagList& lst) {
    return std::any_of(lst.begin(), lst.end(), [this](const SharedTag& t) {
        return t->name == this->name;
    });
}
Run Code Online (Sandbox Code Playgroud)

Tag是正常的class.当然,应该进行比较,t == this这将是operator==后来的比较.为简单起见,我没有在此处包含此内容.

那么,是不是可以写上代码只有一次(不包括的typedef的虽然)为std::vector,std::array,std::list(,也许对std::set)等?

我找不到所有这些类的基类型......这将是我的第一个想法......

Cor*_*lks 5

选项1(好):直接使用std::find:

std::vector<int> v; // populate v however you want
std::vector<int>::const_iterator i = std::find(v.cbegin(), v.cend(), 42);
if (i != v.end()) {
    // Now you know 42 is in v
} else {
    // Now you know 42 is not in v
}
Run Code Online (Sandbox Code Playgroud)

选项2(更好):包装std::find辅助函数:

template <typename Container, typename Value>
bool contains(const Container& c, const Value& v)
{
    return std::find(std::begin(c), std::end(c), v) != std::begin(c);
}

// Example usage:
std::vector<int> v; // populate v however you want
if (contains(v, 42)) {
    // You now know v contains 42
}
Run Code Online (Sandbox Code Playgroud)

选项3(最好):使用find提供一个容器的方法(对于已分类的容器更快set),以及std::find不提供一个容器的容器:

// If you want to know why I added the int and long parameter,
// see this answer here: http://stackoverflow.com/a/9154394/1287251

template <typename Container, typename Value>
inline auto contains(const Container& c, const Value& v, int) -> decltype(c.find(v), bool()) {
    return c.find(v) != std::end(c);
}

template <typename Container, typename Value>
inline bool contains(const Container& c, const Value& v, long) {
    return std::find(std::begin(c), std::end(c), v) != std::end(c);
}

template <typename Container, typename Value>
bool contains(const Container& c, const Value& v) {
    return contains(c, v, 0);
}

// Example usage:
std::set<int> s; // populate s however you want
if (contains(s, 42)) {
    // You now know s contains 42
}
Run Code Online (Sandbox Code Playgroud)

当然,你可以写std::find自己,但你也可以使用它.