修改 STL 列表中的元素 - C++
Modifying elements in a STL List - C++
我正在尝试使用 C++ 中的广义列表构建二叉搜索树。
class Element
{
private:
list<Element*> _children;
char* _name;
// and other data members/methods...
}
如您所见,我有一个 class "Element" 并且它有一个元素指针列表“_children”。
我正在尝试访问这些 children 以便我可以向它们添加 children 等等...
但是,我不能用我目前使用 "const_iterator" 的方法修改这些值,我这样做的原因是 _children [=33= 的 "begin()" 方法]是一个const_iterator.
有人帮忙吗?谢谢:)
更新:非常感谢大家...事实证明,我错误地使用了一个方法 return _children 数据成员的常量引用。
const list<Element*>& getChildren();// return [_children]
我刚刚删除了 const,它现在可以完美运行了。谢谢! :D
如果您想将 _children 用作数组,试试 std::vector class 而不是 std::list 怎么样?
这是用法。
#include <iostream>
#include <vector>
int main(void) {
std::vector<int> list;
list.push_back(1);
list.push_back(2);
list.push_back(3);
for (int i = 0; i < list.capacity();++i){
std::cout << list[i] << std::endl;
}
return 0;
}
如果列表是 const,begin 函数将 return 一个 const_iterator
。因此,对于 _children
列表,您应该能够获得标准迭代器以让您对其执行非常量操作:
list<Element*>::iterator it = _children.begin();
但是,如果您传递对列表的 const 引用,然后尝试从中获取非 const 迭代器,这将不起作用。不允许这样的事情:
void doSomething( const list<Element*>& l )
{
list<Element*>::iterator it = l.begin();
}
您需要将非常量引用传递给列表。
另一种不允许这样做的情况是在 const 函数中,即
void doSomething() const
{
list<Element*>::iterator it = _children.begin();
}
但需要查看更多代码才能确认您是否这样做。
我正在尝试使用 C++ 中的广义列表构建二叉搜索树。
class Element
{
private:
list<Element*> _children;
char* _name;
// and other data members/methods...
}
如您所见,我有一个 class "Element" 并且它有一个元素指针列表“_children”。
我正在尝试访问这些 children 以便我可以向它们添加 children 等等...
但是,我不能用我目前使用 "const_iterator" 的方法修改这些值,我这样做的原因是 _children [=33= 的 "begin()" 方法]是一个const_iterator.
有人帮忙吗?谢谢:)
更新:非常感谢大家...事实证明,我错误地使用了一个方法 return _children 数据成员的常量引用。
const list<Element*>& getChildren();// return [_children]
我刚刚删除了 const,它现在可以完美运行了。谢谢! :D
如果您想将 _children 用作数组,试试 std::vector class 而不是 std::list 怎么样?
这是用法。
#include <iostream>
#include <vector>
int main(void) {
std::vector<int> list;
list.push_back(1);
list.push_back(2);
list.push_back(3);
for (int i = 0; i < list.capacity();++i){
std::cout << list[i] << std::endl;
}
return 0;
}
如果列表是 const,begin 函数将 return 一个 const_iterator
。因此,对于 _children
列表,您应该能够获得标准迭代器以让您对其执行非常量操作:
list<Element*>::iterator it = _children.begin();
但是,如果您传递对列表的 const 引用,然后尝试从中获取非 const 迭代器,这将不起作用。不允许这样的事情:
void doSomething( const list<Element*>& l )
{
list<Element*>::iterator it = l.begin();
}
您需要将非常量引用传递给列表。
另一种不允许这样做的情况是在 const 函数中,即
void doSomething() const
{
list<Element*>::iterator it = _children.begin();
}
但需要查看更多代码才能确认您是否这样做。