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

时间:2017-03-01 04:44:33

标签: c++ c++11 initializer-list

例如

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});

但是我的代码出错了。没有从列表到容器的转换。如何解决这个问题?

1 个答案:

答案 0 :(得分:3)

您目前编写的示例不仅因为比较而无法编译,还因为来自 braced-init-list 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));