从std::vector的开头删除元素

44

我有一个以下数据结构的向量

struct Rule {
        int m_id = -1;
        std::wstring name;
        double angle;
    };

std::vector<Rule>& topPriorityRules;

我正在使用以下方式删除向量的第一个元素

topPriorityRules.erase(topPriorityRules.begin());

除了从 std::vector 的开头删除元素之外,还有其他好的替代方法吗?


3
你遇到了什么错误? - stark
1
不可能。我的向量没有pop_front函数。它是一个向量或自定义结构体。 - sohel14_cse_ju
2
@ВиталикБушаев std::vector没有pop_front()函数。 - acraig5075
http://stackoverflow.com/help/mcve。结构体Rule没问题,ScanRule是什么?你会将什么赋值给topPriorityRules?你的声望为622,却不知道如何发布问题。 - Stargateur
@acraig5075,你说得对,是我的错。 - Виталик Бушаев
显示剩余6条评论
2个回答

82

考虑到

std::vector<Rule>& topPriorityRules;

删除引用向量的第一个元素的正确方法是

topPriorityRules.erase(topPriorityRules.begin());

这正是你所建议的。

看起来我需要对迭代器进行重载。

为了删除 std::vector 的第一个元素,不需要对迭代器进行重载。


附注:如果你打算从前面删除元素,Vector(动态数组)可能是一种错误的数据结构选择。


如果您有一个std::vector<Rule *>,并且您删除其中一个索引,那么您只是删除指针,对吗?为了防止内存泄漏,必须有其他东西拥有该指针或通过“delete topPriorityRules [0];”然后“topPriorityRules.erase(topPriorityRules.begin());”进行删除,对吗? - Brad B.
1
@BradB。如果指针指向动态分配的对象,并且指针拥有该对象,则在删除指针之前必须删除该对象。使用拥有内存的裸指针是一个不好的主意。 - eerorika
@BradB。我会创建一个shared_ptr<>()的向量,以确保它们在需要时被删除,而无需在每个实例中显式指定。 - Alexis Wilke
其他条件相同,这个怎么样?std::vector<Rule*> tmp(topPriorityRules.begin()+1, topPriorityRules.end()); topPriorityRules.swap(tmp); - marcbf

23

三个建议:

  1. 针对您的特定情况,使用std::deque而不是std::vector以获得更好的性能,并使用方法std::deque::pop_front()
  2. 重新考虑(我是说:删除)std::vector<ScanRule>& topPriorityRules;中的&
  3. 使用std::vector::erase() (请参见Caleth的评论)。

为什么我的 vector 没有 pop_front 函数? - sohel14_cse_ju
2
vector::erase 不会重新分配内存,它只是移动被删除元素后面的元素。因此,删除前面的元素会导致其他所有元素向前移动。 - Caleth
@VCSEL 为什么使用 std::deque 而不是 std::queue? - KcFnMi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接