如何修改boost多索引的只读元素?
Posted
技术标签:
【中文标题】如何修改boost多索引的只读元素?【英文标题】:how to modify the read only elements of boost multi index? 【发布时间】:2012-05-09 06:13:22 【问题描述】:我刚刚注意到我无法在 boost 多索引容器元素中进行更改。这是真的? (基于以下简化代码)查看“更新”功能:
#include <boost/multi_index_container.hpp>
#include <boost/multi_index/ordered_index.hpp>
#include <boost/multi_index/random_access_index.hpp>
#include <boost/multi_index/identity.hpp>
#include <boost/multi_index/member.hpp>
namespace sim_mob
enum TrafficColor
Red =1, ///< Stop, do not go beyond the stop line.
Amber = 2, ///< Slow-down, prepare to stop before the stop line.
Green = 3, ///< Proceed either in the forward, left, or right direction.
FlashingRed = 4, ///future use
FlashingAmber = 5, ///future use
FlashingGreen = 6 ///future use
;
//Forward declarations
class Link
public:
int aa;
;
//////////////some bundling ///////////////////
using namespace ::boost;
using namespace ::boost::multi_index;
typedef struct
sim_mob::Link *LinkTo;
sim_mob::Link *LinkFrom;
// ColorSequence colorSequence;
TrafficColor currColor;
linkToLink;
typedef multi_index_container<
linkToLink,
indexed_by< // index
random_access<>,//0
ordered_non_unique< member<linkToLink,sim_mob::Link *, &linkToLink::LinkTo> >, // 1
ordered_non_unique< member<linkToLink,sim_mob::Link *, &linkToLink::LinkFrom> > // 2
>
> links_map;
class Phase
public:
typedef links_map::nth_index_iterator<1>::type LinkTo_Iterator;
Phase(double CycleLenght,std::size_t start, std::size_t percent): cycleLength(CycleLenght),startPecentage(start),percentage(percent)
;
void update(double lapse)
links_map_[0].currColor = Red;
std::string name;
private:
sim_mob::links_map links_map_;
;
//namespace
int main()
sim_mob::Phase F(100,70,30);
无需浏览整个程序。请注意,在更新方法中,我收到此错误: multiIndex$ c++ exp2.cpp exp2.cpp:在成员函数“void sim_mob::Phase::update(double)”中: exp2.cpp:69:29:错误:在只读对象中分配成员“sim_mob::linkToLink::currColor”
我刚刚在boost tutorial 中读到迭代器只授予 const 访问权限。我该如何解决这个问题? 谢谢你的帮助
【问题讨论】:
【参考方案1】:在多索引容器中更改元素的三种不同方式。您可以使用links_map_.replace(iterator, new_value)
将现有元素替换为新元素。您可以使用links_map_.modify(iterator, unaryFunctionObject)
使用修饰符对象更改元素。最后,如果成员变量不属于任何索引,您可以将其声明为mutable
并直接更改它。在您的示例中,后者应该可以正常工作。
其他两种方式,看Boost.MultiIndex Documentation中成员函数replace
和modify
的说明。
编辑:在您的具体情况下,mutable
的方法可能如下所示:
struct linkToLink
sim_mob::Link* LinkTo;
sim_mob::Link* LinkFrom;
// simplify write operations to this variable if used in a multi-index
// container - bypassing the const-ness. This is possible, because the
// variable is not part of any index.
mutable TrafficColor currColor;
;
【讨论】:
感谢您的回答。如果您可以修改我的代码示例以显示我们需要触摸的位置以及如何触摸,那将会提供更多信息和帮助(尤其是对我而言)。可变的解决方案就足够了。谢谢和问候以上是关于如何修改boost多索引的只读元素?的主要内容,如果未能解决你的问题,请参考以下文章
具有可迭代对象的字典字典到具有多索引的可迭代对象索引的熊猫数据框