【发布时间】:2014-04-01 05:47:46
【问题描述】:
简答:用户 modify 代替,接受答案中的详细信息以及 this answer
我正在尝试使用持有指针类型的boost::multi_index_container。在我看来,replace 功能已损坏,我想知道我做错了什么。
下面的代码演示了两种情况:第一个容器保存数据的副本(正常工作),第二个容器保存指向数据的指针(失败)。
using namespace boost::multi_index;
using boost::multi_index_container;
struct Data
{
int key1;
int key2;
};
using DataContainer =
multi_index_container<
Data,
indexed_by<
hashed_unique<member<Data, int, &Data::key1>>,
hashed_unique<member<Data, int, &Data::key2>>>>;
using DataPtrContainer =
multi_index_container<
Data*,
indexed_by<
hashed_unique<member<Data, int, &Data::key1>>,
hashed_unique<member<Data, int, &Data::key2>>>>;
TEST(DummyTest, Test1)
{
Data data{1,2};
DataContainer dataContainer;
dataContainer.insert(data);
EXPECT_EQ(1, dataContainer.get<0>().find(1)->key1);
EXPECT_EQ(2, dataContainer.get<0>().find(1)->key2);
auto iter = dataContainer.get<0>().find(1);
Data d = *iter;
d.key2 = 5;
dataContainer.replace(iter, d);
EXPECT_EQ(1, dataContainer.get<1>().find(5)->key1);
EXPECT_EQ(5, dataContainer.get<1>().find(5)->key2);
}
TEST(DummyTest, Test2)
{
Data* data = new Data{1,2};
DataPtrContainer dataContainer;
dataContainer.insert(data);
EXPECT_EQ(1, (*dataContainer.get<0>().find(1))->key1);
EXPECT_EQ(2, (*dataContainer.get<0>().find(1))->key2);
auto iter = dataContainer.get<0>().find(1);
Data* d = *iter;
d->key2 = 5;
dataContainer.replace(iter, d);
EXPECT_EQ(1, (*dataContainer.get<1>().find(5))->key1); // fail as the iterator not dereferencable
EXPECT_EQ(5, (*dataContainer.get<1>().find(5))->key2); // fail as the iterator not dereferencable
}
【问题讨论】:
-
附言。如果您讨厌测试用例格式并且更喜欢可以复制粘贴编译的代码,请告诉我...
-
我讨厌测试用例格式,更喜欢可以复制粘贴编译的代码。 :)(虽然说真的:))
标签: c++ boost boost-multi-index