[英]std::vector vs std::initializer_list issue: undefined bahevior
我有此帮助程序方法可以附加到链表(下面的代码):
void append(const std::initializer_list<T>& vals) {
for (const auto& val : vals)
append(val);
}
我首先尝试用std :: vector附加1,5,7,9像这样:
void append(const std::vector<T>& vals) {
for (const auto& val : vals)
append(val);
}
但是它用0,0,7,9而不是1,5,7,9填充了链表。 有什么想法吗?
这是完整的代码:
template <typename T>
class LinkedList {
private:
struct Node {
const T& val_;
std::shared_ptr<Node> next_ = nullptr;
Node(const T& val) : val_(val) {}
};
public:
std::shared_ptr<Node> head_ = nullptr;
std::shared_ptr<Node> current = nullptr;
// could be optimized
void append(const std::initializer_list<T>& vals) {
for (const auto& val : vals)
append(val);
}
void append(const T& val) {
if (!head_) {
head_ = std::make_shared<Node>(val);
return;
}
current = head_;
while (current->next_)
current = current->next_;
current->next_ = std::make_shared<Node>(val);
}
template <typename Func>
void for_each(Func f) {
current = head_;
while (current) {
f(current->val_);
current = current->next_;
}
}
};
int main() {
LinkedList<int> lst;
lst.append({1,5,7,9});
auto printer = [](int val) {
std::cout << val << " ";
};
lst.for_each(printer);
std::cout << '\n';
}
这里的一个编程错误是您的节点存储了一个引用const T& val_;
。 存储值,而不是const T val_;
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.