删除矢量的第一项

soh*_*_ju 14 c++ c++11

这是我的类型:

struct Rule
    {
        int m_id = -1;
        std::wstring name;
        double angle;
    };
Run Code Online (Sandbox Code Playgroud)

该类型的矢量:

std::vector<Rule>& topPriorityRules;
Run Code Online (Sandbox Code Playgroud)

我想删除第一个元素:

topPriorityRules.erase(topPriorityRules.begin());
Run Code Online (Sandbox Code Playgroud)

但不能这样做.看起来我需要做迭代器重载.

任何人都可以为我的结构建议迭代器重载吗?

eer*_*ika 37

特定

std::vector<Rule>& topPriorityRules;
Run Code Online (Sandbox Code Playgroud)

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

topPriorityRules.erase(topPriorityRules.begin());
Run Code Online (Sandbox Code Playgroud)

这正是你的建议.

看起来我需要做迭代器重载.

没有必要重载迭代器以擦除第一个元素std::vector.


如果您打算从前面擦除,PS Vector(动态数组)可能是数据结构的错误选择.


VCS*_*SEL 14

两个建议:

  1. 在特定情况下使用std::deque而不是std::vector更好的性能并使用该方法std::deque::pop_front().
  2. 重新思考(我的意思是:删除)&instd::vector<ScanRule>& topPriorityRules;

  • 显然它不是按标准实现的:参见 [link](http://www.cplusplus.com/reference/vector/vector/?kw=vector) 或 [link](http://en.cppreference.com/w/ cpp/容器/向量)。原因可能是`.pop_front()`成员函数对于`std::vector`来说效率很低,因为它必须分配几乎相同数量的内存(这也是一个稳定性问题)并复制其余部分. `deque` 专为需要 `pop_front()` 的情况而设计。事实上,如果不需要通过索引进行随机访问,`std::list` 也会很有用。 (3认同)
  • `vector::erase` 不会重新分配,它会在删除元素后移动元素。因此,删除前面的元素会移动其他所有元素。 (2认同)