C++ std::vector vs std::initializer_列表问题:未定义bahevior
我将此帮助器方法附加到链接列表(下面的代码):C++ std::vector vs std::initializer_列表问题:未定义bahevior,c++,c++11,vector,initializer-list,C++,C++11,Vector,Initializer List,我将此帮助器方法附加到链接列表(下面的代码): void append(const std::initializer_list&vals){ 用于(常数自动和val:val) 追加(val); } 我首先尝试用std::vector附加1,5,7,9,如下所示: void append(const std::vector<T>& vals) { for (const auto&
void append(const std::initializer_list&vals){
用于(常数自动和val:val)
追加(val);
}
我首先尝试用std::vector附加1,5,7,9,如下所示:
void append(const std::vector<T>& vals) {
for (const auto& val : vals)
append(val);
}
void append(const std::vector&vals){
用于(常数自动和val:val)
追加(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';
}
模板
类链接列表{
私人:
结构节点{
康斯特瓦勒;
std::shared\u ptr next\uu=nullptr;
节点(const T&val):val_(val){}
};
公众:
标准::共享头=空头;
std::shared_ptr current=nullptr;
//可以优化
void append(const std::初始值设定项\u list&vals){
用于(常数自动和val:val)
追加(val);
}
无效附加(常量T&val){
如果(!头){
头=标准::使共享(val);
返回;
}
电流=水头;
while(当前->下一步)
当前=当前->下一步;
当前->下一步=标准::使共享(val);
}
模板
_each(Func f){
电流=水头;
当(当前){
f(当前->值);
当前=当前->下一步;
}
}
};
int main(){
LinkedList lst;
lst.append({1,5,7,9});
自动打印机=[](int-val){
std::cout这里的一个编程错误是您的节点存储了一个引用const T&val;
。而是存储值const T val;
这里的一个编程错误是您的节点存储了一个引用const T&val;
。而是存储值const T val;
您是否已通过代码来执行此操作看到它在做什么了吗?为什么有任意数量的右尾随间距?在这两种情况下,节点都存储一个悬空引用。“这是完整的代码”嗯,那么你应该读@John。这是一项非常重要的技能,在大多数情况下,它可以发现你的大部分问题。这里有一个关于如何调试小程序的好链接:你是否仔细阅读了代码以了解它在做什么?为什么你有任意数量的右尾随间距?在这两种情况下,节点都会存储一个悬空引用。“这是完整的代码”嗯,那你应该读@John。这是一项非常重要的技能,在大多数情况下,它可以发现你的大部分问题。这是一个关于如何调试小程序的好链接:哦,我猜这是一个未定义的行为,这就是为什么我看到它适用于初始值设定项\u list而不是vector?你也提到了”一个编程错误“.你看到其他人了吗?@John这是我注意到的第一件事,因为我避开了引用成员。我没有发现其他任何东西。哦,所以我猜还有未定义的行为,这就是为什么我看到它对初始值设定项而不是向量有效?你还提到了“一个编程错误”“。你看到其他人了吗?@John这是我注意到的第一件事,因为我避开了推荐人。我没有发现其他任何东西。
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';
}