【发布时间】:2014-11-12 07:31:42
【问题描述】:
如果我取消注释这些
//BaseList baselist;
//MemberList memberlist;
在循环之外并注释掉循环内它崩溃的那些。我需要能够在任何循环之外拥有基本列表(和成员列表)。这是如何实现的?
编辑
我试图以最简单的形式解决的实际问题是这样的。
我想要一个
MyClass的 std::vector,称之为 AllThingsBunchedTogether。 我还想要一个BaseList的std::vector,称之为AllThingsSpreadOut。所以
- AllThingsBunchedTogether 可能包含(为简洁起见,仅包含
anInt1部分):1,2,1,10,2,3,4,4,5,9,10,10。- AllThingsSpreadOut 可能在 [1]
1,1在 [2]2,2在 [3]3在 [4]4,4在 [5]5在 [5] 包含(零暂时未使用) 9]9在 [10]10,10,10。请注意,数字本身并不存储在
BaseList中,而是例如MyClass(1, "John")。在 [1] 可能是“Mike”、“John”,在 [2] 可能是“Mike”、“Dagobart”在 [3] "John" ... at [10] "John" "Mike" "Dagobart" 等,因此没有重复 AllThingsSpreadOut[i] 中的任何
BaseList,因为每个MyClass在每个BaseList散列到不同的值 (anInt1 + Name)。本质上,
anInt1告诉MyClass在 AllThingsSpreadOut 中的位置,但anInt1 + name保证每个BaseList内的唯一性。所以想法是 AllThingsSpreadOut 是
BaseList的向量,其中向量位置的每个BaseList是相似事物的列表。然后,当我从 AllThingsBunchedTogether 中删除内容时(不是通过清除,而是通过搜索以删除某些项目,例如 IsMarkedToDelete 下面的代码),它们将自动从相应的 AllThingsSpreadOut 中消失。
AllThingsSpreadOut 作为 AllThingsBunchedTogether 的一种,具有侵入性语义。 AllThingsBunchedTogether 允许通过 [] 进行超快速访问。
结束编辑
#include <vector>
#include <iostream>
#include <boost/intrusive/list.hpp>
using namespace boost::intrusive;
class MyClass : public list_base_hook<link_mode<auto_unlink>> // This is a derivation hook
{
public:
std::string name;
bool bIsMarkedToDelete;
int anInt1;
public:
list_member_hook<link_mode<auto_unlink>> member_hook_; // This is a member hook
MyClass(std::string n, int i) : name(n), anInt1(i), bIsMarkedToDelete(false) {}
};
bool IsMarkedToDelete(const MyClass &o)
{
return o.bIsMarkedToDelete;
}
//Define a list that will store MyClass using the public base hook
typedef list<MyClass, constant_time_size<false>> BaseList;
// Define a list that will store MyClass using the public member hook
typedef list<MyClass,
member_hook<MyClass, list_member_hook<link_mode<auto_unlink>>, &MyClass::member_hook_>,
constant_time_size<false> > MemberList;
int main()
{
bool done = false;
std::vector<MyClass> values;
std::string names[] = {"John", "Mike", "Dagobart"};
//BaseList baselist;
//MemberList memberlist;
int i = 0;
while(!done)
{
// Create several MyClass objects, each one with a different value
for (int j = 0; j < 11; ++j)
values.emplace_back(names[j % 3], j);
BaseList baselist;
MemberList memberlist;
// Now insert them in t-he reverse order in the base hook list
for (auto& e : values)
{
baselist.push_front(e);
memberlist.push_back(e);
}
// Now test lists
auto rbit(baselist.rbegin());
auto mit(memberlist.begin());
auto it(values.begin()), itend(values.end());
// Test the objects inserted in the base hook list
for (; it != itend; ++it, ++rbit)
{
if (&*rbit != &*it)
return 1;
}
// Test the objects inserted in the member hook list
for (it = values.begin(); it != itend; ++it, ++mit)
{
if (&*mit != &*it)
return 1;
}
# if 0
for(auto& e : values)
std::cout << e.anInt1 << "\n";
for(auto& e : baselist)
std::cout << e.anInt1 << "\n";
for(auto& e : memberlist)
std::cout << e.anInt1 << "\n";
#endif // 0
if(2 == i)
{
for(auto& e: values)
std::cout << e.name << "\n";
for(auto& e: values)
{
if("Mike" == e.name)
e.bIsMarkedToDelete = true;
}
values.erase(
std::remove_if(values.begin(), values.end(), IsMarkedToDelete), values.end());
}
if(i++ > 3)
{
values.clear();
done = true;
}
std::cout << "\n";
std::cout << values.size() << "\n";
std::cout << baselist.size() << "\n";
std::cout << memberlist.size() << "\n";
}
}
【问题讨论】:
-
我无法弄清楚你想在这里实现什么。鉴于示例代码,我看不出任何有意义的“解决方案”。你能告诉我们你想要实现什么(除了人为的目标,比如“我需要能够让基础列表(和成员列表)在任何循环之外”)
-
sehe,我要解决的实际问题比这要复杂得多,以至于我不得不考虑如何以简单的方式提出问题。给我一点时间来改写它。
-
干杯。思考总是解决方案(“如何通过在 Stackoverflow 上几乎询问问题来解决问题”)
-
参见上面的编辑。希望这是有道理的。相信我,我已经为这个问题奋斗了好几天。我觉得自己很愚蠢,但我知道问题在于我对 Intrusive 的不熟悉。你现在明白为什么我不能把 Baselist 放在一个循环中了吗?
-
我正在研究这个问题。问题可能是我使用对象而不是指向对象的指针...
标签: c++ c++11 boost intrusive-containers