2011-05-11 71 views
4

我从http://www.sgi.com/tech/stl/download.html下载了STL源代码,但只有函数声明的.h。我在哪里可以下载.cpp文件来阅读实际的实施?何处下载C++ STLsource代码.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); 

我不t看交换的实际代码在哪里。在这里,它只是自称。

+0

这不是自称在那里,相反,你的最后一条语句代码iter_swap文件stl_algobase.h内。 – GManNickG 2011-05-11 06:10:44

+0

你为什么要下载这个源代码?您的C++标准库附带了当今真正重要的唯一STL版本。 – jalf 2011-05-11 09:31:21

回答

4

.h文件包含实现。该页面上的许多标题只是包装其他标题或提供typedef,但如果您查看stl_set.h等文件,则会看到它具有set类的所有函数定义。

即使页面本身也声明它是一个只有标题的库,这意味着实现包含在标题中。

+0

根据你和其他人的回答,我猜这个实现是编译器特有的。我想我应该可以在g ++编译器中找到实现。 – Amumu 2011-05-11 05:25:49

+2

@Amumu:你是误解。该实现在.h文件中。没有一些特定于编译器的.cpp文件或者包含实现的东西。整个实现在头文件中。所有的。你什么都不需要。 – Omnifarious 2011-05-11 05:30:14

3

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

1

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

+0

嗯,我找不到一些实现,比如map和multimap中的swap函数。 – Amumu 2011-05-11 05:44:38

2

这不是别的。请注意,页面上显示:

的STL的这种分配完全由头文件:没有必要链接到任何库文件

1

你可以找到实施swapstd_algobase.h

5

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

或者你可以匿名结账的源代码这里: svn签的svn://gcc.gnu.org/svn/gcc/trunk/libstdc++-v3的libstdC++

0

的SGI STL文件名全部启动与“stl_”。

例如,SGI版本矢量的实现在文件stl_vector.h中。

0

下面是交换和

// 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; 
}