【问题标题】:Should I use size_type in my code [closed]我应该在我的代码中使用 size_type [关闭]
【发布时间】:2013-09-15 12:07:08
【问题描述】:

我有一组不同类型的容器,每个容器都与一个字符串 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";
  }
}

【问题讨论】:

  • 是成员 typedef:std::vector&lt;T&gt;::size_type.
  • 你的意思是你想传递一个字符串的大小?
  • @billz 不,另一个容器
  • 你为什么要传递大小?您可以从传递的向量或字符串中获取它。
  • 您仍然不需要将尺寸作为单独的参数传递。

标签: c++


【解决方案1】:

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

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

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

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

如果有,size_type 在什么命名空间中?

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

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

定义在&lt;vector&gt;;您必须将其限定为 std::vector&lt;whatever&gt;::size_type

std::size_t&lt;cstddef&gt; 中定义。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 在命名空间std下我有size_t但没有size_type。什么给了?
    • @Baz,我已将文章链接附加到我的答案中:非常值得一读。请注意,尽管 juanchopanza 在问题 cmets 中指出,为什么需要传递大小?我从来没有这样做过。我会改为传递对数据容器的常量引用。
    【解决方案3】:

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

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

    然后调用它:

    printIfNotEmpty(a_string, a_vector.empty());
    

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

    【讨论】:

      【解决方案4】:

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

      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())
          // ...
      }
      

      【讨论】:

        【解决方案5】:

        不,您需要传递std::vector&lt;T&gt;::size_type,其中T 是您的对象的类型。

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

        【讨论】:

          猜你喜欢
          • 2011-07-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-02-09
          • 2016-06-19
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多