分配一个我不想等于任何可能输入的变量是什么?
问题是
实现函数 unique_in_order ,它将序列作为参数并返回一个项目列表,其中没有任何具有相同值的元素彼此相邻并保留元素的原始顺序。
例如:
uniqueInOrder("AAAABBBCCDAABBB") == {'A', 'B', 'C', 'D', 'A', 'B'}
uniqueInOrder("ABBCcAD") == {'A', 'B', 'C', 'c', 'A', 'D'}
uniqueInOrder([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;
}
问题是有时第一个元素是 0。我可以最后分配什么永远不会匹配输入?我尝试使用 NULL 但我认为无论如何都编译为 0。
回答
There's an algorithm to do just that called std::unique_copy
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;
}