首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将STL容器内容与初始化程序列表进行比较

将STL容器内容与初始化程序列表进行比较
EN

Stack Overflow用户
提问于 2015-11-18 13:13:36
回答 4查看 90关注 0票数 1

我想做这样的事

代码语言:javascript
运行
复制
std::vector<int> foobar()
{
    // Do some calculations and return a vector
}

std::vector<int> a = foobar();
ASSERT(a == {1, 2, 3});

这个是可能的吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-11-18 13:34:02

不幸的是,您不能重载operator==以接受std::initializer_list作为第二个参数(这是一种语言规则)。

但是,您可以定义任何其他函数来接受对initializer_list的const引用。

代码语言:javascript
运行
复制
#include <iostream>
#include <algorithm>
#include <vector>

template<class Container1, typename Element = typename Container1::value_type>
bool equivalent(const Container1& c1, const std::initializer_list<Element>& c2)
{
    auto ipair = std::mismatch(begin(c1),
                               end(c1),
                               begin(c2),
                               end(c2));
    return ipair.first == end(c1);
}


int main() {
    std::vector<int> x { 0, 1, 2 };
    std::cout << "same? : " << equivalent(x, { 0 , 1 , 2 }) << std::endl;
}

预期结果:

代码语言:javascript
运行
复制
same? : 1
票数 5
EN

Stack Overflow用户

发布于 2015-11-18 13:17:15

是:

代码语言:javascript
运行
复制
ASSERT(a == std::vector<int>{1,2,3});
票数 3
EN

Stack Overflow用户

发布于 2015-11-18 13:26:29

您必须显式指定右手操作数的类型。例如

代码语言:javascript
运行
复制
std::vector<int> v = { 1, 2, 3 };
assert( v == std::vector<int>( { 1, 2, 3 } ) );

因为operator ==是一个模板函数,编译器无法将第二个操作数推断为std::vector<int>类型。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33781070

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档