为什么矢量子项不被修改?
Why vector children is not modified?
我想修改循环vector
堆栈条目while
但不知何故引用修改不起作用。我瘦了,我正在修改复制的,但我无法弄清楚如何修改真实条目。
#include <iostream>
#include <memory>
#include <string>
#include <utility>
#include <vector>
int main() {
struct Node {
Node* parent;
std::vector<std::unique_ptr<Node> > children;
Node(Node* parent) : parent(parent){};
};
struct Tree {
std::unique_ptr<Node> root;
Tree():root(new Node{nullptr}){};
};
std::unique_ptr<Tree> t{new Tree};
auto p = t->root.get();
p->children.emplace_back(new Node{p});
p->children.emplace_back(new Node{p});
p = p->children[0].get();
p->children.emplace_back(new Node{p});
p = p->children[0].get();
p->children.emplace_back(new Node{p});
p->children.emplace_back(new Node{p});
using Сhildren_const_iterator = decltype(std::cbegin(t->root->children));
struct FirstCurrentLast {
const Сhildren_const_iterator first;
Сhildren_const_iterator current;
const Сhildren_const_iterator last;
};
std::vector<FirstCurrentLast> stack;
stack.push_back({std::cbegin(t->root->children),
std::cbegin(t->root->children),
std::cend(t->root->children)});
auto print_stack = [&stack]() {
std::cout << "/stack.size= " << stack.size() << "n";
std::string row1, row2, row3;
for (auto&& it : stack) {
row1.append(std::to_string(0)).append("_.");
row2.append(std::to_string(it.current - it.first)).append("_.");
row3.append(std::to_string(it.last - it.first)).append("_.");
};
std::cout << "first |" << row1 << ";n";
std::cout << "current|" << row2 << ";n";
std::cout << "last |" << row3 << ";nn";
};
while (!stack.empty()) {
FirstCurrentLast& iterators = stack.back();
Сhildren_const_iterator first = iterators.first;
Сhildren_const_iterator& current = iterators.current;
Сhildren_const_iterator last = iterators.last;
std::cout << ">begin n";
print_stack();
if (current == last) {
stack.pop_back();
continue;
};
if (!current->get()->children.empty()) {
print_stack();
stack.push_back({std::cbegin(current->get()->children),
std::cbegin(current->get()->children),
std::cend(current->get()->children)});
print_stack();
};
iterators.current++;
print_stack();
std::cout << "end<nn";
abort();
};
std::cout << "fini okn";
}
我得到输出:
>begin
/stack.size= 1
first |0_.;
current|0_.;
last |2_.;
/stack.size= 1
first |0_.;
current|0_.;
last |2_.;
/stack.size= 2
first |0_.0_.;
current|0_.0_.;
last |2_.1_.;
/stack.size= 2
first |0_.0_.;
current|0_.0_.;
last |2_.1_.;
end<
但它应该看起来像这样:
>begin
/stack.size= 1
first |0_.;
current|0_.;
last |2_.;
/stack.size= 1
first |0_.;
current|0_.;
last |2_.;
/stack.size= 2
first |0_.0_.;
current|1_.0_.;
last |2_.1_.;
/stack.size= 2
first |0_.0_.;
current|1_.0_.;
last |2_.1_.;
end<
问题可能是因为您的iterators
引用因stack
向量上的push_back
而无效。尝试使用deque
而不是vector
,或者在调用push_back
后重新获取对向量所需元素的引用。
相关文章:
- 为什么我可以通过引用修改常量返回
- 为什么不能修改对象中的值?另外,我如何改进此链表?
- 为什么在我的函数类型后使用引用运算符 (&) 允许我修改它返回的值?
- 为什么可以修改数组 b?
- 为什么矢量子项不被修改?
- 为什么从另一个构造函数内部调用C++构造函数不修改类变量?
- 为什么我的项目没有保存名称中所做的修改
- 为什么 Boost multi_index只修改第一个索引的键时对第二个索引进行比较?
- 未定义的对象(〔basic.life〕/8):为什么允许引用重新绑定(和常量修改)
- C++ 为什么const X&可以通过功能进行修改?
- 为什么我应该在scanf()-家族成员中包含一个长度修饰符作为参数?有什么好处?使用长度修改器进行扫描的作用
- 为什么我可以通过原始指针而不是shared_ptr来修改对象
- 为什么 QObject::d isconnect(const QMetaObject::Connection &connection) 采用 const 参数并打算修改它?
- 为什么当返回类型为 const 时可以修改返回值
- 为什么基于范围的循环不修改容器元素?
- 为什么双指针不修改表?
- 为什么我可以在C 11中使用const函数修改类
- 为什么常量变量是可修改的?
- 我的类的可变参数模板构造函数无法修改我的类成员,为什么会这样?
- C++为什么可以修改返回的常量引用