是c++;标准库容器没有实现? 我重新实现C++ STD容器。 《Marc Gregoire的专业C++》中的P> 我读了这句话

是c++;标准库容器没有实现? 我重新实现C++ STD容器。 《Marc Gregoire的专业C++》中的P> 我读了这句话,c++,containers,c++-standard-library,C++,Containers,C++ Standard Library,c++标准指定每个容器的接口,而不是实现 实现意味着容器中只有“模板类”代码 C++标准容器库中的实现是什么? < P>引用的意思是C++标准指定了应该做什么,而不是应该如何做。例如,如果standard说“functionsum必须返回对其参数求和的结果”,那么编译器可以以任何可用的方式轻松实现此行为,因此下一次的每个实现都是合法的,并且在特定编译器中选择哪个实现只取决于编译器开发人员 template<typename T> T sum(T a, T b) { retu

c++标准指定每个容器的接口,而不是实现

实现意味着容器中只有“模板类”代码


C++标准容器库中的实现是什么?

< P>引用的意思是C++标准指定了应该做什么,而不是应该如何做。例如,如果standard说“function
sum
必须返回对其参数求和的结果”,那么编译器可以以任何可用的方式轻松实现此行为,因此下一次的每个实现都是合法的,并且在特定编译器中选择哪个实现只取决于编译器开发人员

template<typename T>
T sum(T a, T b)
{
    return a+b;
}

template<typename T>
T sum(T a, T b)
{
    return -(-a - b);
}

template<typename T>
T sum(T a, T b)
{
    return ("some random string" > 0)*a + b;
}

模板
T总和(T a,T b)
{
返回a+b;
}
模板
T总和(T a,T b)
{
返回-(-a-b);
}
模板
T总和(T a,T b)
{
返回(“某个随机字符串”>0)*a+b;
}

<引用>意味着C++标准规定了应该做什么,而不是应该如何做。例如,如果standard说“function
sum
必须返回对其参数求和的结果”,那么编译器可以以任何可用的方式轻松实现此行为,因此下一次的每个实现都是合法的,并且在特定编译器中选择哪个实现只取决于编译器开发人员

template<typename T>
T sum(T a, T b)
{
    return a+b;
}

template<typename T>
T sum(T a, T b)
{
    return -(-a - b);
}

template<typename T>
T sum(T a, T b)
{
    return ("some random string" > 0)*a + b;
}

模板
T总和(T a,T b)
{
返回a+b;
}
模板
T总和(T a,T b)
{
返回-(-a-b);
}
模板
T总和(T a,T b)
{
返回(“某个随机字符串”>0)*a+b;
}

<代码> > p>您可以在线查找所有C++标准的草稿。我建议看一看。你可以在那里找到具体的例子,所以我可以使用一些假设

 void foo(int* a,int* b);
现在,例如
foo
的规范将说明以下内容:

  • 前提条件:
    a
    b
    指向同一数组中的元素
  • 后置条件:范围
    [a,b)
    中的所有元素都已被加载
  • 复杂性:
    O(距离(a,b))

<> P> C++。用户阅读标准并知道它是做什么的。实现者也阅读了标准,需要执行在那里写的东西。例如,标准保证<代码> FoO 具有线性复杂度。这是如何实现的:<代码> Foo。

< p>在线上可以找到所有C++标准的草稿。我想看看其中的一个。你可以在那里找到具体的例子,所以我可以使用一些假设

 void foo(int* a,int* b);
现在,例如
foo
的规范将说明以下内容:

  • 前提条件:
    a
    b
    指向同一数组中的元素
  • 后置条件:范围
    [a,b)
    中的所有元素都已被加载
  • 复杂性:
    O(距离(a,b))

<> P> C++。用户阅读标准并知道它是做什么的。实现者也阅读标准,并且需要实现在那里写的东西。例如,标准保证<代码> FoO 具有线性复杂度。这是如何实现的:<代码> Foo。< /P> < P>标准指定了功能。关注该功能是如何实现的。这类似于编写作业问题。教师指定学生代码所需的功能,而学生决定如何实现。通常,有多个正确答案


让我们以
std::vector
为例。标准规定
std::vector::size()
必须在固定时间内返回容器中的元素数。这意味着容器将在某个位置存储该大小,但在何处存储该大小取决于实现

一个实现可能会决定将该信息直接存储在
vector
类中,如下所示(请接受我已经删节了一些细节,以便重点关注相关部分。)


两种实现都满足标准(很好的C++ 17标准),在(S/E)/<代码>之前必须是“代码> CONTXPRP</代码>),前者是为了速度而优化,后者是针对(本地)优化的。就C++标准而言,任何一种方法都是可以接受的。

< P> C++指定了函数。它不关心函数是如何实现的。这与编码作业问题类似。老师指定学生代码所需的功能,而学生决定如何实现。事实上,正确答案不止一个


让我们以
std::vector
为例。标准规定
std::vector::size()
必须在固定时间内返回容器中的元素数。这意味着容器将在某个位置存储该大小,但在何处存储该大小取决于实现

一个实现可能会决定将该信息直接存储在
vector
类中,如下所示(请接受我已经删节了一些细节,以便重点关注相关部分。)


两种实现都满足标准(很好的C++ 17标准),在(S/E)/<代码>之前必须是“代码> CONTXPRP</代码>),前者是为了速度而优化,后者是针对(本地)优化的。就C++标准而言,任何一种方法都是可以接受的。标准:只需说明它不是如何实现的。只需查看它。它指定接口,但不实现。“C++标准容器库中的实现是什么?”没有C++标准库的实现。每个编译器。(MSVC/Clang/G++/等)可以自由实现,标准中概述的接口,以及它们认为合适的方式。标准只是说明了什么,而不是说明了它是如何实现的