请帮我解读STL自动填充建议

时间:2012-06-15 14:03:12

标签: c++ templates stl

我在VS上使用带有STL的MSVC。它给出的自动填充建议给了我悲伤。你能否打破std::transform功能的这个建议?

_OutTy * transform<_InIt1, _InTy, _InSize, _OutTy, _OutSize, _Fn2>
(_InIt1 _First1, _InIt1 _Last1, _InTy (&_First2)[_InSize], _OutTy(&_Dest)[_OutSize], _Fn2 _Func)

编辑:很抱歉,我应该更清楚了。我看到了转换的文档。我希望有人分解上面句子中的各种符号。

感谢。

4 个答案:

答案 0 :(得分:3)

建议的重载是第3和第4个参数都是数组的情况下的特殊化。 _InTy (&_First2)[_InSize]的可读性更高InType (&Second)[InputLength],即Second是对InType[InputLength]类型数组的引用。

此专业化的优点是编译器知道第二个输入序列的长度。主重载只有一个模板InputIterator BeginOfSecond参数,但没有EndOfSecond参数。

类似地,_OutTy(&_Dest)[_OutSize]允许编译器检测输出序列的长度(如果是数组)。

答案 1 :(得分:3)

_OutTy* // output type   
transform<_InIt1, // input iterator type for first range
          _InTy, _InSize, // input and size type for second range (array)
          _OutTy, _OutSize, // output and size type for output range (array)
          _Fn2> // transformation function object type
(_InIt1 _First1, _InIt1 _Last1, // first and last iterators for first range
 _InTy (&_First2)[_InSize], // array for second range
 _OutTy(&_Dest)[_OutSize], // array for output range
 _Fn2 _Func) // transformation function object

我的建议:不要浪费你的时间这样做。我花了好几分钟才把它打破了,我已经习惯了这个东西。按照其他帖子的建议快速访问文档。

如果您希望能够破译MSVC的C ++库实现,则有助于查看其标题而不仅仅是智能感知。您将了解他们使用的一些常见约定,例如InIt用于输入迭代器,RanIt用于随机访问迭代器等。理解基本STL概念(如序列,输入)也很重要。迭代器,双向迭代器等。这是一个相当过时但仍然很好且措辞谨慎的参考文献:http://www.sgi.com/tech/stl/table_of_contents.html

关于此重载的注意事项是第二个范围和输出范围是自动推导出大小的数组,而第一个范围通常指定为指向范围的开始和结束的几个迭代器。否则前三个参数将是输入迭代器,第四个和返回类型将是输出迭代器。

答案 2 :(得分:1)

将cplusplus.com的参考资料更新为cppreference.com

来自cppreference.com

template< class InputIterator1, class InputIterator2, class OutputIterator, class BinaryOperation >
OutputIterator transform( InputIterator1 first1, 
                          InputIterator1 last1,
                          InputIterator2 first2, 
                          OutputIterator d_first, 
                          BinaryOperation binary_op );

参数

  • first1,last1 - 要转换的第一个元素范围
  • first2 - 要转换的第二个元素范围的开头
  • d_first - 目的地范围的开头,可能等于first1或first2
  • binary_op - 将应用的二进制运算函数对象。 函数的签名应该等同于以下内容: Ret fun(const Type1 &a, const Type2 &b); 签名不需要const&amp ;. 类型Type1和Type2必须使得InputIterator1和InputIterator2类型的对象可以被解除引用,然后分别隐式转换为Type1和Type2。 Ret类型必须能够取消引用类型为OutputIterator的对象并为其指定类型为Ret的值。

返回值

  • 将迭代器输出到转换后的最后一个元素之后的元素。

希望有所帮助

答案 3 :(得分:0)

事实上,C ++ Intellisense有时会很痛苦。因此,我建议在MSDN上点击F1或搜索std :: transform:http://msdn.microsoft.com/en-us/library/391xya49%28v=VS.71%29.aspx给出以下解释:

_First1
    An input iterator addressing the position of the first element in the first source range to be operated on.
_Last1
    An input iterator addressing the position one past the final element in the first source range operated on.
_First2
    An input iterator addressing the position of the first element in the second source range to be operated on.
_Result
    An output iterator addressing the position of the first element in the destination range.
_Func
    User-defined unary function object used in the first version of the algorithm that is applied to each element in the first source range or A user-defined (UD) binary function object used in the second version of the algorithm that is applied pairwise, in a forward order, to the two source ranges.