不确定要使用哪种数据结构

Not sure what data structure to use

本文关键字:数据结构 不确定      更新时间:2023-10-16

我目前正在尝试使用结构的向量/代数。 结构的简单示例...

struct job {
    int id;
    int time;
}

我希望能够搜索结构以找到与时间匹配的作业,将其从结构中删除并继续检查该结构中的其他 id。 示例代码...

<vector> jobs;
<deque> started;
for (unsigned int i = 0; i < jobs.size(); i++)
{
    if (jobs.at(i).time == time)
    {
        started.push_back(jobs.at(i));
        jobs.erase(jobs.begin() + i);
        i--;
    }
} 
time++;

这按照我想要的方式工作,但它似乎也很笨拙,因为我每次删除时都会调整索引,我认为这仅仅是因为我对数据结构的了解不如我。 有人能给我一些建议吗?

注意 - 我不认为这与这篇文章被标记的内容重复,因为我不想用我已经拥有的东西有效地做一些事情。 对我来说,考虑到我每次从中获得所需的东西时都会减小 deque 的大小,这似乎足够有效。 我希望的是一些建议,以确定我尝试使用deques的最佳数据结构是什么,这些数据结构可能不会在我处理它们时进行处理。

我也可能错了,我的用法很好,但对我来说似乎不对劲。

好吧,我一直都知道这个演讲会派上用场!这里的信息是"了解你的 STL 算法"。有了这个,让我向您介绍std::stable_partition.

您可以做的一件事是只使用一个向量,如下所示:

using namespace std;
vector<job> jobs;
// fill the vector with jobs
auto startedJobsIter = stable_partition(begin(jobs), end(jobs), 
    [=time](job const &_job) { return _job.time == time; }); 

现在,begin(jobs)startedJobsIter之间的一切都满足条件,而startedJobsIterend(jobs)之间的一切都不满足条件。

编辑

如果你不关心项目的相对顺序,那么你只使用 std::partition ,它可以提高性能,因为它不会保留原始向量中元素的相对顺序,但仍然会将其分为两部分。

编辑 2

以下是对旧C++标准的改编:

struct job_time_predicate {
public:
    job_time_predicate(int time) : time_(time) { }
    bool operator()(job const &the_job) { return the_job.time == time_; }
private:
    int time_;
};
int main()
{
    using namespace std;
    int time = 10;
    vector<job> jobs;
    // fill that vector
    vector<job>::iterator startedJobsIter = 
        stable_partition(jobs.begin(), jobs.end(), job_time_predicate(time));
}