我应该在我的代码中使用size_type吗?

时间:2013-09-11 12:47:52

标签: c++

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

5 个答案:

答案 0 :(得分:6)

  

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

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

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

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

  

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

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

  

如何在代码中包含其定义?

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

std::size_t<cstddef>中定义。

答案 1 :(得分:2)

size_type位于std,顺便说一下,它不是一个对象。是的,你应该用它来实现便携性。例如,在Win64中,如果您使用int,则会收到转化警告,因为size_type大于该平台上的int

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

答案 2 :(得分: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。

答案 3 :(得分: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())
    // ...
}

答案 4 :(得分:-1)

不需要传递std::vector<T>::size_type,其中T是您对象的类型。

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