2

我寻找了相同类型的问题,但没有找到问题的答案(存在问题):我应该选择哪种类型的钩子来控制列表中的对象?我在指针和迭代器之间摇摆不定。

容器在开始时已装满,之后不应调整大小。钩子是我用来根据用户的突发奇想在我的对象之间切换并在我的算法中只操纵一个变量的方式。

在所有情况下,我都必须通过一个迭代器来找到要挂钩的正确对象。但是哪一个是最佳实践/使用?

// 10 object list
std::list <Object> List(10);

std::list <Object>::iterator it = List.begin();
Object *pt = NULL;

// Select the 3rd object
advance(it, 3);
pt = &(*it);

// Access to object member...
it->member;
pt->member;

与迭代器相反,指针不允许访问邻居,但可能不安全。最好的做法是什么?

4

3 回答 3

2

这取决于你想用“钩子”做什么。如果使用迭代器,它可以用作在列表中向前或向后移动的起点。如果使用指针,还可以指向列表之外的对象。最后,这取决于您期望代码如何发展。

于 2013-07-16T08:29:48.147 回答
1

将指针或迭代器存储到容器中是非常危险的,因为您可能会在使用它们时发现它们是无效的(即,如果容器或数据发生更改)。

更通用和更强大的方法可能是使用地图而不是列表。每个值都由一个键(您喜欢的任何类型)标识,您可以轻松地存储这些键并在使用它们之前检查它们是否有效,例如:

std::map<int, std::string> data;

// Add stuff to the map
data[5] = "blah";
data[27] = "foo";

// Check if a key exists
if (data.find(31) == data.end()) {
    // Key 31 does NOT exist
} else {
    // Key 31 DOES exist
}

不过要注意的一件事是地图是按键值排序的。这意味着如果元素的顺序很重要,那么您需要仔细选择您的密钥。

于 2013-07-16T09:31:17.260 回答
0

在大多数情况下使用引用:

Object& ref = *it;
ref.member

它的行为就像一个指针(所以可以随意将它传递给函数),但你不能对它进行指针运算(ref++实际上会调用operator++()on Object)。您也不能从 null 初始化它(当您尝试创建引用时将报告为错误)。

要记住的一件事是,您仍然需要将对象放置在某个地方。如果说某个函数从列表中删除了您不应该再使用的对象ref

于 2013-07-16T08:50:50.337 回答