1

我在 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

4 回答 4

3

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

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

同样,_OutTy(&_Dest)[_OutSize]如果这是一个数组,则允许编译器检测输出序列的长度。

于 2012-06-15T14:56:08.643 回答
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

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

于 2012-06-19T01:49:51.583 回答
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 &。Type1 和 Type2 类型必须使得 InputIterator1 和 InputIterator2 类型的对象可以被取消引用,然后分别隐式转换为 Type1 和 Type2。Ret 类型必须使得 OutputIterator 类型的对象可以被取消引用并分配一个 Ret 类型的值。​</li>

返回值

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

希望有帮助

于 2012-06-15T14:20:32.247 回答
0

事实上,C++ Intellisense 有时会很痛苦。因此,我建议按 F1 或在 MSDN 上搜索 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. 
于 2012-06-15T14:21:23.977 回答