独特元素向量的C ++模板函数

时间:2015-08-23 23:59:02

标签: c++ templates vector

我正在尝试创建一个模板函数,该函数通过引用获取类型为T的输入向量,并以仅包含唯一元素的方式修改该向量:

这是我到目前为止所得到的:

template<typename T>
void uniqueOnly(vector<T>& vec){
  typedef typename std::vector<T>::iterator it;
  it = std::unique(vec.begin(), vec.end());
  vec.resize( std::distance(vec.begin(),it) );
}

但是,在尝试编译时遇到了一些错误,即:

  

functions.cpp:52:6:错误:期望unqualified-id it =   std :: unique(vec.begin(),vec.end());

  

functions.cpp:53:41:错误:意外的类型名称&#39;它&#39;:预期   表达式vec.resize(std :: distance(vec.begin(),it));

请有人这么慷慨解密我的错误信息,并指出我正确的方向来解决问题吗?

2 个答案:

答案 0 :(得分:3)

这两个错误都在抱怨,因为it是一种类型,但您尝试将其用作对象。

typedef的声明中删除it,以便声明迭代器对象,而不是迭代器类型的同义词类型。

或者,只是:

auto it = std::unique(vec.begin(), vec.end());
vec.resize( std::distance(vec.begin(),it) );

答案 1 :(得分:1)

您将it定义为std::vector<T>::iterator类型。 所以你的代码不会编译,因为it不是迭代器,它是迭代器类型。

template <typename T>
void uniqueOnly(std::vector<T>& vec){
  typedef typename std::vector<T>::iterator It; // It is the name of a type
  It it = std::unique(vec.begin(), vec.end());
  vec.erase(it, vec.end());                     // uses aschepler's suggestion
}