如何比较容器和初始化列表以查看它们是否相等?
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));
例如
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));