如何比较容器和初始化列表以查看它们是否相等?

How to compare a container and a initializer-list to see if they are equal?

例如

template<class Container, class List>
bool isEqual(Container const& c, List const& l)
{
    return c == Container(l); // Error!!
}

并通过

检查
std::vector<int> v;
bool b = isEqual(v, {1, 2, 3});

但是我的代码出错了。没有从列表到容器的转换。如何修复错误?

你的例子,正如目前所写的那样,不仅会因为比较而编译失败,而且还会因为 braced-init- 中的模板参数 List cannot be deduced名单.

或者把函数改成

template<class Container, class T>
bool isEqual(Container const& c, std::initializer_list<T> const& l)

或更改您的称呼方式

std::vector<int> v;
auto l = {1, 2, 3};
bool b = isEqual(v, l);
// or
bool b = isEqual(v, std::initializer_list<int>{1, 2, 3});

如 Igor 在评论中提到的那样,要修复比较,请使用

return c.size() == l.size() && std::equal(std::begin(c), std::end(c), std::begin(l));

或者,如果您可以访问 std::equal 的 C++14 重载,它将开始和结束迭代器带到两个范围,您可以跳过大小检查

return std::equal(std::begin(c), std::end(c), std::begin(l), std::end(l));