当前位置:  开发笔记 > 编程语言 > 正文

找到最大容器大小C++

如何解决《找到最大容器大小C++》经验,为你挑选了1个好方法。

我正在努力为以下问题找到一个好的解决方案:

我想实现一个函数,它接受可变数量的容器参数并返回最大容器的大小.这是一个例子:

std::vector vStr(2, "foo");
std::vector vInt(1, 123);
std::vector vDouble(3, 1.1);
std::list lChar(4, '*');
// or even more container

size_t uiMaxSize = getMaxContainerSize(vStr, vInt, vDouble, lChar /*, ...*/);

在这种情况下getMaxContainerSize应返回4,因为lChar最大尺寸为4.

我已经使用以下方法实现了此解决方法cstdarg:

#include 
...
size_t getMaxContainerSize(int iCnt, ... )
{
  size_t uiMaxSize = 0;
  va_list ap;
  va_start(ap, iCnt);
  for(int i=0; i

但有了这个,我必须.size()为每个容器键入,我还必须指定容器的数量.我也不喜欢在C++程序中使用C语言,我问自己是否有更好的方法来实现它.也许通过使用一些类和重载,operator<<()所以我可以键入这样的东西:

MaxSizeFinder cFinder;
cFinder << vStr << vInt << vDouble << lChar;
size_t uiMaxSize = cFinder.getResult();

你觉得这样的事情有可能吗?有什么建议?

谢谢.



1> chris..:

使用可变参数模板:

template
std::ptrdiff_t getMaxContainerSize(const Conts&... conts) {
    return std::max({conts.size()...});
}

当您将容器作为参数传递时,编译器将推导出类型列表Conts.函数的每个参数都是const &*.使用conts.size()...expands conts1.size(), conts2.size(), ..., contsN.size(),conts#给函数赋予每个参数.事实证明它std::max有一个方便的重载,你可以委托给它.

与C变量函数相比,可变参数模板有几个关键优势:

它们是类型安全的 - 编译器保证在类型不匹配时抱怨,并且您不需要格式字符串或任何东西.

该函数知道传递了多少个参数,你可以使用它sizeof...(Conts).

进入时,参数没有什么特别的事情发生.在一个可变函数中,当函数必须将它取出时,char它将是一个特殊int的函数.

使用参数时,不需要显式指定任何类型.这意味着您可以接受无限多种类型而不是预定义列表(想想printf的格式说明符).

最后,根据注释,返回类型被更改为签名类型,该类型主要作为签名对应方size_t(类似于非标准类型ssize_t).


为了面向未来的答案,很快就会std::size有更通用的方法来获得容器的大小:

using std::size;
return std::max({size(conts)...});

这扩展类似于上面: size(conts1), size(conts2), ..., size(contsN)


*通常,参数包与T&&...with 一起使用std::forward而不是const T&....size当使用的对象是rvalue时,这可能会为您带来第三方类的东西,这些类具有更高效的功能.然而,它增加了复杂性,因为任何好处的机会都很低.

推荐阅读
赛亚兔备_393
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有