c++ - 如何使函数参数容器独立

标签 c++ templates iterator

我正在编写一个实用程序函数,它将采用元素 vector (可以是字符串、整数、 double 、字符)并将其连接成单个字符串并返回它。它看起来像这样:

template<typename T>
std::string convert2Str(std::vector<T> const& vec) 
{
   std::ostringstream sStream; 
   for (size_t k=0; k<vec.size(); ++k) {
      sStream << vec[k] << " "; 
   }
   return sStream.str(); 
}

我想让这个函数更通用:

  • 首先使用迭代器而不是为 vector<T> 使用索引.我试过这个 std::vector<T>::const_iterator it = vec.begin()在循环之前,编译器给了我一个错误: :错误:预期;在它之前 当我将上述定义更改为 std::vector<std::string>::const_iterator it = vec.begin()错误消失了。所以,看起来我没有遵循正确的语法,请告诉我它是什么
  • 其次是通过使第一个参数容器独立来使函数更通用。给定任何容器( vectorlistqueuedeque 等)我想做与上面相同的事情。我试着在 stackoverflow 中搜索这个,但没有找到满意的答案。

最佳答案

第 1 步,如您所说,使用迭代器:

template<typename T>
std::string convert2Str(std::vector<T> const& vec) 
{
   typedef std::vector<T> container;
   std::ostringstream sStream; 
   for (typename container::const_iterator it = vec.begin(); it != vec.end(); ++it) {
      sStream << *it << " "; 
   }
   return sStream.str(); 
}

第 2 步,将模板参数设为容器类型而不是元素类型(您可以使用 value_type 取回元素类型:

template<typename container>
std::string convert2Str(container const& vec)
{
   typedef container::value_type T; // if needed
   std::ostringstream sStream; 
   for (typename container::const_iterator it = vec.begin(); it != vec.end(); ++it) {
      sStream << *it << " "; 
   }
   return sStream.str(); 
}

在 C++0x 中,这变得更简单(并且不需要 typename):

template<typename container>
std::string convert2Str(container const& vec)
{
   using std::begin;
   using std::end;
   std::ostringstream sStream;
   for (auto it = begin(vec); it != end(vec); ++it) {
      typedef decltype(*it) T; // if needed
      sStream << *it << " "; 
   }
   return sStream.str(); 
}

除其他优点外,std::beginstd::end 适用于原始数组。

关于c++ - 如何使函数参数容器独立,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5451305/

相关文章:

c++ - Sleep()函数Windows 8 C++

c++ io streams sync_with_stdio 没有区别

templates - 内省(introspection)模板参数(尤其是模板别名参数)

c++ - 将可变参数模板类声明为简单模板类的友元

c++ - 函数模板推导指南?

c++ - gcc 抑制警告 "too small to hold all values of"

c++ - 如何让 C++ 控制台每次都在同一个位置显示 cin

rust - 如何获得 Rust 中最大值元素的迭代器?

java - 从集合的迭代器中获取第一项会返回一个随机值吗?

java - 在 Java(1.5 或更高版本)中,从 Set 中获取(任何)元素的最佳执行方式是什么?