哪里可以下载 C++ STL源代码.h和.cpp文件?

发布于 2024-11-06 04:52:34 字数 576 浏览 0 评论 0原文

我从 http://www.sgi.com/tech/stl/ 下载了 STL 源代码download.html ,但它只有 .h 作为函数声明。在哪里可以下载 .cpp 文件以阅读实际实现?

例如,在 stl_multimap.h 或 stl_map.h 中,它具有:

template <class _Key, class _Tp, class _Compare, class _Alloc>
inline void swap(multimap<_Key,_Tp,_Compare,_Alloc>& __x, 
                 multimap<_Key,_Tp,_Compare,_Alloc>& __y) {
  __x.swap(__y);
}

我想知道交换的实际实现,因为

__x.swap(__y);

我看不到交换的实际代码在哪里。在这里,它只是调用自己。

I downloaded the STL source code from http://www.sgi.com/tech/stl/download.html , but it only has the .h for the function declaration. Where can I download the .cpp files to read the actual implementation?

For example, in the stl_multimap.h or in stl_map.h, it has:

template <class _Key, class _Tp, class _Compare, class _Alloc>
inline void swap(multimap<_Key,_Tp,_Compare,_Alloc>& __x, 
                 multimap<_Key,_Tp,_Compare,_Alloc>& __y) {
  __x.swap(__y);
}

I want to know the actual implementation of the swap as in

__x.swap(__y);

I don't see where the actual code for swap is. In here, it just calls itself.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

自由范儿 2024-11-13 04:52:34

.h 文件包含实现。该页面上的许多标头只是其他标头的包装器或提供 typedef,但如果您查看像 stl_set.h 这样的文件,您将看到它具有 <代码>设置类。

甚至页面本身也声明它是一个仅包含标头的库,这意味着实现包含在标头中。

The .h files contains the implementations. Many of the headers on that page are just wrappers around other headers or provide typedefs, but if you look at a file like stl_set.h, you will see that it has all the definitions of functions for the set class.

Even the page itself states that it is a header-only library, which means that the implementations are included in the headers.

始于初秋 2024-11-13 04:52:34

C++ 库的实现因不同的编译器/系统而异。
如果您使用 GCC/G++ 作为编译器,您可以从 http://gcc 下载源代码。 gnu.org/libstdc++/

或者您可以使用以下命令匿名查看源代码

svn checkout svn://gcc.gnu.org/svn/gcc/trunk/libstdc++-v3 libstdc++

The implementation of the C++ library varies on different compiler/system.
If you are using GCC/G++ as your compiler, here you can download the source code from http://gcc.gnu.org/libstdc++/ .

Or you can anonymously checkout the source code using this command:

svn checkout svn://gcc.gnu.org/svn/gcc/trunk/libstdc++-v3 libstdc++
谎言月老 2024-11-13 04:52:34

STL是一个模板库。我希望您只能在头文件中找到实现。

STL is a template library. I hope you will find the implementation in header files only.

夜血缘 2024-11-13 04:52:34

没有别的事了。请注意,该页面显示:

此 STL 发行版完全由头文件组成:无需链接到任何库文件

The isn't anything else. Note that the page says:

This distribution of the STL consists entirely of header files: there is no need to link to any library files

爱情眠于流年 2024-11-13 04:52:34

实现都在头文件中。您必须使用模板来做到这一点。 :-/

The implementations are all in header files. You have to do that with templates. :-/

ζ澈沫 2024-11-13 04:52:34

您可以在 std_algobase.h 中找到 swap 的实现。

You can find implementation for swap in std_algobase.h.

淡忘如思 2024-11-13 04:52:34

SGI STL 文件名均以“stl_”开头。

例如,SGI 版本向量的实现位于文件 stl_vector.h 中。

The SGI STL file names all start with "stl_".

For example, the SGI version vector's implemetation is in file stl_vector.h.

空心↖ 2024-11-13 04:52:34

下面是文件 stl_algobase.h 中 swap 和 iter_swap 的代码

// swap and iter_swap

template <class _ForwardIter1, class _ForwardIter2, class _Tp>
inline void __iter_swap(_ForwardIter1 __a, _ForwardIter2 __b, _Tp*) {
  _Tp __tmp = *__a;
  *__a = *__b;
  *__b = __tmp;
}

template <class _ForwardIter1, class _ForwardIter2>
inline void iter_swap(_ForwardIter1 __a, _ForwardIter2 __b) {
  __STL_REQUIRES(_ForwardIter1, _Mutable_ForwardIterator);
  __STL_REQUIRES(_ForwardIter2, _Mutable_ForwardIterator);
  __STL_CONVERTIBLE(typename iterator_traits<_ForwardIter1>::value_type,
                    typename iterator_traits<_ForwardIter2>::value_type);
  __STL_CONVERTIBLE(typename iterator_traits<_ForwardIter2>::value_type,
                    typename iterator_traits<_ForwardIter1>::value_type);
  __iter_swap(__a, __b, __VALUE_TYPE(__a));
}

template <class _Tp>
inline void swap(_Tp& __a, _Tp& __b) {
  __STL_REQUIRES(_Tp, _Assignable);
  _Tp __tmp = __a;
  __a = __b;
  __b = __tmp;
}

Below is code for swap and iter_swap inside file stl_algobase.h

// swap and iter_swap

template <class _ForwardIter1, class _ForwardIter2, class _Tp>
inline void __iter_swap(_ForwardIter1 __a, _ForwardIter2 __b, _Tp*) {
  _Tp __tmp = *__a;
  *__a = *__b;
  *__b = __tmp;
}

template <class _ForwardIter1, class _ForwardIter2>
inline void iter_swap(_ForwardIter1 __a, _ForwardIter2 __b) {
  __STL_REQUIRES(_ForwardIter1, _Mutable_ForwardIterator);
  __STL_REQUIRES(_ForwardIter2, _Mutable_ForwardIterator);
  __STL_CONVERTIBLE(typename iterator_traits<_ForwardIter1>::value_type,
                    typename iterator_traits<_ForwardIter2>::value_type);
  __STL_CONVERTIBLE(typename iterator_traits<_ForwardIter2>::value_type,
                    typename iterator_traits<_ForwardIter1>::value_type);
  __iter_swap(__a, __b, __VALUE_TYPE(__a));
}

template <class _Tp>
inline void swap(_Tp& __a, _Tp& __b) {
  __STL_REQUIRES(_Tp, _Assignable);
  _Tp __tmp = __a;
  __a = __b;
  __b = __tmp;
}
往事随风而去 2024-11-13 04:52:34

您不需要下载文件。您可以使用 STL,因此该库的某些版本必须位于您计算机上的某个位置。这引出了 Stackoverflow 上已经提出的另一个问题:哪里是C++ 标准库的头文件

您可以使用 bash 工具“locate”。例如。 “locate stl_multimap.h”对我来说会产生:

/usr/include/c++/5/bits/stl_multimap.h
/usr/include/c++/6/bits/stl_multimap.h
/usr/include/c++/7/bits/stl_multimap.h
/usr/include/c++/8/bits/stl_multimap.h
/usr/lib/gcc-snapshot/include/c++/9/bits/stl_multimap.h

一旦你查看了目录,其他所有东西都在哪里应该变得非常明显。

在每个位置,我都会找到该文件的不同编译器版本。对于我的计算机,所有 gcc 7.* 文件都位于我的 /usr/include/c++/7 目录中。

如果由于某种可怕的原因您使用 Windows,我相信您将能够使用 Powershell 找到等效的命令。

You don't need to download the files. You're able to use the STL, so some versions of the library must be on your computer somewhere. This leads to the another question already asked on Stackoverflow: Where are the headers of the C++ standard library.

You can use the bash tool "locate". eg. "locate stl_multimap.h" for me yields:

/usr/include/c++/5/bits/stl_multimap.h
/usr/include/c++/6/bits/stl_multimap.h
/usr/include/c++/7/bits/stl_multimap.h
/usr/include/c++/8/bits/stl_multimap.h
/usr/lib/gcc-snapshot/include/c++/9/bits/stl_multimap.h

Once you have a look at the directories it should become pretty obvious where everything else is too.

In each of those locations I'll find the different compiler versions of the file. For my computer, all the gcc 7.* files are in my /usr/include/c++/7 directory.

If for some horrible reason you use Windows, I'm sure that you'll be able to find an equivalent command with Powershell.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文