这是因为没有办法将std :: vector转换为std :: string,而是需要抽象概念集合。
这样做是为了让人们可以通过他们可以使用数组,矢量,字符串,列表,deque ...只要它符合集合的'概念'(这里希望C++ 1x带有概念!)他们甚至可以使用自己的内部特别优化的收集类型。这就是模板的美妙之处。
使用C++ 11(适用于任何标准的集合,原始阵列,和用户定义的类型):
template<class elem_t, class list_t>
bool in_list(const elem_t& elem, const list_t& list) {
for (const auto& i : list) {
if (elem == i) {
return true;
}
}
return false;
}
编辑:这是一个非标准扩展来推断的std :: initializer_list作为模板参数,所以提供一个明确的控制装置:
template<class elem_t>
bool in_list(const elem_t& elem, std::initializer_list<elem_t> list) {
for (const auto& i : list) {
if (elem == i) {
return true;
}
}
return false;
}
在这个版本中,你可以这样调用它:
int main() {
std::vector<int> a = {1, 2, 3, 4, 5};
std::cout << in_list(3, a) << std::endl;
std::string b = "asdfg";
std::cout << in_list('d', b) << std::endl;
std::cout << in_list('d', "asdfg") << std::endl;
std::cout << in_list(3, {1, 2, 3, 4, 5}) << std::endl;
return 0;
}
对于我们这些仍然使用C++ 98的人来说,这将适用于字符串和向量以及一些用户定义的类型。尽管如此,它仍然不能用于原始数组。
template<class elem_t, class list_t>
bool in_list_98(const elem_t& elem, const list_t& list) {
list_t::const_iterator end = list.end(); //prevent recomputation of end each iteration
for (list_t::const_iterator i = list.begin(); i < end; ++i) {
if (elem == *i) {
return true;
}
}
return false;
}
或者,你可以去STL风格:
template<class elem_t, class iterator_t>
bool in_list_stl(const elem_t& elem, iterator_t begin, iterator_t end) {
for (iterator_t i = begin; i < end; ++i) {
if (elem == *i) {
return true;
}
}
return false;
}
//call like std::string s = "asdf"; in_list_stl('s', s.begin(), s.end());
如果我犯了一个错误,对不起,我没有我的编译器现在正在运行...
该品种是好的。简短的答案是传递一个字符串,而不是一个字符串向量,期望它转换为一个字符串。尽管如此,在技术上有'include()'或'find()';没有必要自己写一个坚实的) – chris 2012-04-29 03:45:59
我认为克里斯在我刷新我的页面之前删除了他对我的问题的评论,因为它已经不存在了,因为他提到的解决了我的问题。我感觉很傻。我有'std :: string'作为'inList()'的参数,因为我不知道我可以直接使用'std :: vector'。我想我应该使用'std :: string',因为这是向量所带来的,但是现在我感到无聊的回顾它。**谢谢你的回应,你的回应也有助于未来的参考,罗伯特:)** –
ZeroKnight
2012-04-29 03:54:35
如果你使用std :: includes或std :: find,只记得对end()进行测试。 in_list(a,b)== [](const auto&a,const auto&b){return std :: find(b.begin(),b.end(),a)!= b.end(); } - 我的意思是说lambda是一种抽象,而不是实际的代码 - 我知道我们没有多态lambda表达式。这是我们现在必须与haskell一起离开的事情。 – 2012-04-29 04:08:57