gpt4 book ai didi

c++ - 查找最大容器大小 C++

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:13:45 26 4
gpt4 key购买 nike

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

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

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

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

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

我已经使用 cstdarg 实现了这个变通方法:

#include <cstdarg>
...
size_t getMaxContainerSize(int iCnt, ... )
{
size_t uiMaxSize = 0;
va_list ap;
va_start(ap, iCnt);
for(int i=0; i<iCnt; i++)
{
size_t uiTempSize = va_arg(ap, size_t);
uiMaxSize = uiMaxSize<uiTempSize ? uiTempSize : uiMaxSize;
}
va_end(ap);
return uiMaxSize;
}
...
size_t uiMaxSize = getMaxContainerSize( 4, vStr.size(), vInt.size(), vDouble.size(), lChar.size());

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

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

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

谢谢。

最佳答案

使用可变模板:

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

当您将容器作为参数传递时,编译器将为 Conts 推断出一个类型列表.该函数的每个参数都是一个 const <deduced type> & *。使用 conts.size()...扩展为 conts1.size(), conts2.size(), ..., contsN.size() , 其中conts#是赋予函数的每个参数。原来std::max有一个方便的重载,您可以将其委托(delegate)给。

与 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&&...一起使用与 std::forward而不是 const T&... .这可能会为您购买具有更高效的第三方类的东西 size当使用的对象是右值时函数。但是,它通常会增加复杂性,从而降低获得任何好处的机会。

关于c++ - 查找最大容器大小 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34710890/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com