要检查向量v
是否为空,我可以使用std::empty(v)
或v.empty()
。我查看了cplike上的签名,但缺乏理解它们的知识。它们如何相互关联?一个实现调用另一个实现吗?
我知道其中一个来自容器库,另一个来自迭代器库,但仅此而已。
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 });
}
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)
此过载具有以下效果:
c.empty()
因此,std::empty(v)
和v.empty()
在这种情况下具有相同的效果。
std::vector::empty和std::empty之间的区别
Container::empty
成员函数和std::empty
free函数(模板)的区别与Container::size
,std::size
,Container::data
,std::data
,Container::begin
,std::begin
和Container::end
,std::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