在哪里下载C ++ STLsource代码.h和.cpp文件?

时间:2011-05-11 05:07:31

标签: c++ stl

我从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的实际代码在哪里。在这里,它只是自称。

9 个答案:

答案 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中找到等效的命令。