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