C++ 如何分配我不知道的变量';你不想等于任何可能的输入吗?

C++ 如何分配我不知道的变量';你不想等于任何可能的输入吗?,c++,c++11,C++,C++11,问题是 以参数为参数的顺序实现函数unique_ 序列,并返回不包含任何元素的项列表 相同的值彼此相邻,并保持 元素 例如: 唯一顺序(“AAAABBBCCDAABBB”)=={'A','B','C','D','A','B'} 唯一顺序(“ABBCcAD”)=={'A','B','C','C','A','D'} 唯一顺序([1,2,2,3,3])=={1,2,3} 现在我的解决办法是 template <typename T> std::vector<T> unique

问题是

以参数为参数的顺序实现函数unique_ 序列,并返回不包含任何元素的项列表 相同的值彼此相邻,并保持 元素

例如:

唯一顺序(“AAAABBBCCDAABBB”)=={'A','B','C','D','A','B'}

唯一顺序(“ABBCcAD”)=={'A','B','C','C','A','D'}

唯一顺序([1,2,2,3,3])=={1,2,3}

现在我的解决办法是

template <typename T> 
std::vector<T> uniqueInOrder(const std::vector<T>& iterable){
  std::vector<T> unique_set;
  T last = 0;
  for(auto & element : iterable) {
    if(element != last) {
      unique_set.push_back(element);
    }
    last = element;
  }
  return unique_set;
}
std::vector<char> uniqueInOrder(const std::string& iterable){
  std::vector<char> unique_set;
  char last = 0;
  for(auto & element : iterable) {
    if(element != last) {
      unique_set.push_back(element);
    }
    last = element;
  }
  return unique_set;
}
模板
std::vector uniqueInOrder(常量std::vector和iterable){
std::向量唯一_集;
T last=0;
用于(自动元素:iterable(&E){
如果(元素!=最后一个){
唯一的_集。向后推_(元素);
}
最后=元素;
}
返回唯一的_集;
}
标准::向量唯一顺序(常量标准::字符串和iterable){
std::向量唯一_集;
char last=0;
用于(自动元素:iterable(&E){
如果(元素!=最后一个){
唯一的_集。向后推_(元素);
}
最后=元素;
}
返回唯一的_集;
}

问题是,有时第一个元素是0。我可以在最后分配什么永远不会与输入匹配?我试着使用NULL,但我认为它还是编译为0。

根据
T
的类型,可能没有不可能的值。对于int和char,每个值都是可能的。最好的选择是使用类似,它提供了一个显式的无值值

//这将是无值且不等于任何值
std::可选的最后一个{};
//分配给
最后=元素;

作为
iterable
中的第一个元素,您也可以从它开始。因此,它会被添加到唯一的集合中,并且在for循环中,由于
if(element!=last)
(或者您可以用第二个元素开始循环),它将以任何方式被复制

模板
std::vector uniqueInOrder(常量std::vector和iterable){
std::向量唯一_集;
if(iterable.empty()){
返回唯一的_集;
}
T last=iterable.at(0);
唯一设置。向后推(最后一个);
用于(自动元素:iterable(&E){
如果(元素!=最后一个){
唯一的_集。向后推_(元素);
}
最后=元素;
}
返回唯一的_集;
}

有一种算法可以做到这一点,叫做

模板
std::vector uniqueInOrder(常量std::vector和iterable){
std::向量唯一_集;
std::unique_copy(iterable.begin()、iterable.end()、std::back_inserter(unique_set));
返回唯一的_集;
}
//std::string也是这样
标准::向量唯一顺序(常量标准::字符串和iterable){
std::向量唯一_集;
std::unique_copy(iterable.begin()、iterable.end()、std::back_inserter(unique_set));
返回唯一的_集;
}
带Range-v3

#包括
#包括
#包括
#包括
使用范围::视图::分组依据;
使用范围::视图::转换;
int main(){
std::string s1=“AAAABBBCCDAABBB”;
std::string s2=“abbcad”;
向量v={1,2,2,3,3};
自动处理=分组依据(标准::等于{})
|转换([](自动x){return x.front();});

STD:Cudio:Cudio>代码:STED::可选的< /C> >或如果必须使用第11方版本,如<代码> Boo::可选< /COD>。或者保持“<代码> BoOL <代码> >您是否找到了元素,并使用它来跟踪“NulLess”。并且,是的,<代码> null <代码>只是一个宏,用于<代码> 0 < /Cult> Cost到指针,并且不应该在C++中使用它,而是< C++ >ode>nullptr
相反。听起来像是这样。看起来这跳过了第一组元素。我可以这样做,也可以添加第一个元素,但有时输入向量会是空的。该死,我的大脑把我留在那里了。现在应该是对的。谢谢你指出我假设back\u inserter应用了push\u功能?@Joey Moore是的,你可以在和上阅读更多关于它的信息
template <typename T> 
std::vector<T> uniqueInOrder(const std::vector<T>& iterable){
  std::vector<T> unique_set;
  if(iterable.empty()) {
     return unique_set;
  }
  T last = iterable.at(0);
  unique_set.push_back(last);
  for(auto & element : iterable) {
    if(element != last) {
      unique_set.push_back(element);
    }
    last = element;
  }
  return unique_set;
}
template <typename T> 
std::vector<T> uniqueInOrder(const std::vector<T>& iterable){
  std::vector<T> unique_set;
  std::unique_copy(iterable.begin(), iterable.end(), std::back_inserter(unique_set));
  return unique_set;
}

// same thing for std::string
std::vector<char> uniqueInOrder(const std::string& iterable){
  std::vector<char> unique_set;
  std::unique_copy(iterable.begin(), iterable.end(), std::back_inserter(unique_set));
  return unique_set;
}