当前位置: 首页 > 知识库问答 >
问题:

std::vector::empty和std::empty之间的区别

米项禹
2023-03-14

要检查向量v是否为空,我可以使用std::empty(v)v.empty()。我查看了cplike上的签名,但缺乏理解它们的知识。它们如何相互关联?一个实现调用另一个实现吗?

我知道其中一个来自容器库,另一个来自迭代器库,但仅此而已。

共有3个答案

公羊雅达
2023-03-14

std::empty返回调用std::vector::empty的结果。

std::empty对于容器可能提供或不提供成员函数空()对于提供成员函数的类型,std::empty提供了默认实现,但是对于不提供此函数的自定义类型,您可以在命名空间范围内提供函数,以便在模板中使用;由于参数相关查找,与参数相同的命名空间中的函数将被用作回退:

namespace Custom
{
    struct Container
    {
        bool m_empty;
    };

    constexpr bool empty(Container const& c) // custom implementation for our own type
    {
         return c.m_empty;
    }
}

template<class T>
void PrintEmpty(char const* containerName, T&& container)
{
    using namespace std;
    std::cout << containerName << " is " << (empty(container) ? "empty" : "not empty") << '\n';
}

int main()
{
    PrintEmpty("std::vector<int>()", std::vector<int>());
    PrintEmpty("Container{}", Custom::Container{});
    PrintEmpty("Container{ true }", Custom::Container{ true });
}
吴均
2023-03-14

std::empty有三个重载,但是std::empty(v)用于向量v的重载是第一个:

template <class C>
constexpr auto empty(const C& c) -> decltype(c.empty()); // (since c++17, until c++20)

template <class C>
[[nodiscard]] constexpr auto empty(const C& c) -> decltype(c.empty());
(since C++20) // (since c++20)

此过载具有以下效果:

  1. 返回c.empty()

因此,std::empty(v)v.empty()在这种情况下具有相同的效果。

段弘和
2023-03-14

std::vector::empty和std::empty之间的区别

Container::empty成员函数和std::emptyfree函数(模板)的区别与Container::sizestd::sizeContainer::datastd::dataContainer::beginstd::beginContainer::endstd::end的区别相同。

在所有这些情况下,对于任何标准容器,free函数(例如std::empty)只调用相应的成员函数。free函数的存在旨在提供容器(以及std::initializer_list)和数组之间的统一接口。数组不能像类模板那样有成员函数,因此它们有专门的重载来处理这些自由函数。

如果您使用模板化容器类型编写代码,那么您应该使用自由函数,以便能够支持数组作为模板化类型。如果类型没有模板化,那么除了方便地将成员函数或自由函数重构成模板(或只是普通数组)之外,选择使用成员函数或自由函数没有区别。

 类似资料:
  • 错误:无法将类型为“std::_bit_reference&”的非常量lvalue引用绑定到类型为“std::vector::reference”{aka“std::_bit_reference”}的rvalue 因此,它抱怨,因为只有第二个参数是rvalue

  • 下面的代码显示了我要做的:

  • 我在std::sort中发现了一个bug,特别是在一些QuickSort的实现中,我不知道问题是否出在一般的算法中。 精华: 当元素小于16时,所有的规范都被替换,因为std::sort使用插入排序。 当有17个或更多的元素时,使用快速排序,并从元素数量的对数限制递归深度,但向量在第一次__introsort_loop迭代时有时间恶化。 当有许多相同的元素时,就会出现向量损坏。用无效迭代器替换有效

  • 我在下面的某个地方看到了代码片段。 由于前面提到的代码片段工作得很好,它表明std::cout是从std::ostream派生而来的。但我还找不到任何直接的参考资料。 根据文件,其中说[强调我的]: 全局对象std::cout和std::wcout控制输出到实现定义类型的流缓冲区(源自std::stream buf),与标准C输出流stdout相关联。 上面的引文表示,控制输出到派生自std::s

  • 描述 (Description) empty( )方法从匹配元素集中删除所有子节点。 语法 (Syntax) 以下是使用此方法的简单语法 - <i>selector</i>.empty( ) 参数 (Parameters) 以下是此方法使用的所有参数的说明 - NA 例子 (Example) 以下是一个简单的例子,简单地显示了这种方法的用法 - <html> <head> <t

  • empty 创建一个空 Observable empty 操作符将创建一个 Observable,这个 Observable 只有一个完成事件。 演示 创建一个空 Observable: let id = Observable<Int>.empty() 它相当于: let id = Observable<Int>.create { observer in observer.onCompl