3

我有一组不同类型的容器,每个容器都与一个字符串 id 相关联。如果关联的容器不为空,则以下函数应打印 id。

如果我想将 std::vector 的大小传递给函数,我应该将它作为 size_type 对象传递吗?像这样:

void printIfNotEmpty(const std::string& id, size_type sizeOfContainer)
{
   if(sizeOfContainer)
   {
     output << id << " is not empty";
   }
   else
   {
     output << id << " is empty";
   }
}

如果是这样,size_type 在什么命名空间中?如何在我的代码中包含它的定义?

也许这是一个解决方案:

template<class T>
void printIfNotEmpty(const std::string& id, const T& container)
{
  if(container.size())
  {
     output << id << " is not empty";
  }
  else
  {
     output << id << " is empty";
  }
}
4

5 回答 5

6

我应该将它作为 size_type 对象传递吗?

这是最便携的事情。(顺便说一下,它不是类类型意义上的“对象”;它是无符号整数类型,大到足以表示任何向量的大小)。

如果您知道它是带有标准分配器的向量,并且将来不太可能改变,那么使用它可能会不那么冗长std::size_t

(当然,在这个简单的示例中,传递布尔标志或删除条件并使调用者负责决定是否调用该函数会更有意义;但我假设它旨在表示更复杂的传递大小确实有意义的情况)。

如果是这样,size_type 在什么命名空间中?

每个标准容器(以及旨在满足标准容器要求的任何其他容器)都将其定义为嵌套类型。

如何在我的代码中包含它的定义?

定义在<vector>; 您必须将其限定为std::vector<whatever>::size_type.

std::size_t中定义<cstddef>

于 2013-09-11T13:03:17.257 回答
2

size_type是在std,顺便说一下,不是一个对象。是的,您应该将其用于便携性。例如,在 Win64 中,如果您使用 an,int您将收到转换警告,因为在该平台上size_type大于 an 。int

但在深入研究之前,请参阅'size_t' 与 'container::size_type'

于 2013-09-11T12:50:12.733 回答
2

据我所知,大小不是字符串的大小,因此,如果您只需要执行代码执行的操作,则可以执行以下操作:

void printIfNotEmpty(const std::string& name, bool empty) {
  if(!empty) {
    output << name;
  }
}

并称之为:

printIfNotEmpty(a_string, a_vector.empty());

然而,对于处理大小,我通常使用一个泛型size_t类型,它是一个无符号整数类型,其大小取决于平台。隐式类型转换在这里很好,因此您不必使用std::vector<T>::size_type通常只是 size_t 的 typedef 之类的声明来重载代码。

于 2013-09-11T13:03:04.600 回答
1

这是一个奇怪的界面,因为

printIfNotEmpty("Baz", 37);

没有多大意义。

如果您真的对不同容器的状态感兴趣,请将其作为参数传递。
如果要处理不同类型的容器,请使用模板。

template<typename T>
void printIfNotEmpty(const std::string& name, const std::vector<T>& collection)
{
    if (!collection.empty())
    // ...
}

甚至更一般

template<typename Collection>
void printIfNotEmpty(const std::string& name, const Collection& collection)
{
    if (!collection.empty())
    // ...
}
于 2013-09-11T13:14:51.240 回答
-1

不,您需要传递对象的类型在std::vector<T>::size_type哪里。T

对于第二个问题,size_type是一个typedef(变量类型的“别名”),它是在向量容器类中的命名空间。

于 2013-09-11T12:50:04.787 回答