我从http://www.sgi.com/tech/stl/download.html下载了STL源代码,但它只有函数声明的.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);
我没看到swap的实际代码在哪里。在这里,它只是自称。
答案 0 :(得分:5)
C ++库的实现因不同的编译器/系统而异。 如果您使用GCC / G ++作为编译器,可以在此处从http://gcc.gnu.org/libstdc++/下载源代码。
或者您可以在此处匿名签出源代码: svn checkout svn://gcc.gnu.org/svn/gcc/trunk/libstdc++-v3 libstdc ++
答案 1 :(得分:4)
.h文件包含实现。该页面上的许多标题只是围绕其他标题的包装或提供typedef,但如果你查看像stl_set.h
这样的文件,你会发现它具有set
类的所有函数定义
即使页面本身也声明它是一个仅限标题的库,这意味着这些实现包含在标题中。
答案 2 :(得分:3)
STL是一个模板库。我希望你只能在头文件中找到实现。
答案 3 :(得分:2)
这不是别的。请注意,该页面显示:
STL的这种分发完全由头文件组成:不需要链接到任何库文件
答案 4 :(得分:1)
这些实现都在头文件中。你必须使用模板。 : - /
答案 5 :(得分:1)
您可以在swap
中找到std_algobase.h
的实施。
答案 6 :(得分:0)
SGI STL文件名都以“stl _”开头。
例如,SGI版本向量的实现位于文件stl_vector.h中。
答案 7 :(得分:0)
下面是文件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;
}
答案 8 :(得分:0)
您不需要下载文件。您可以使用STL,因此某些版本的库必须位于计算机上的某个位置。这导致已经在Stackoverflow上问了另一个问题:Where are the headers of the C++ standard library。
您可以使用bash工具“定位”。例如。对我来说,“找到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中找到等效的命令。