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

时间:2016-03-03 20:24:25

标签: c++ data-structures

我目前正在尝试使用结构的矢量/ deques。结构的简单例子......

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++;

这是我想要的方式,但它似乎也非常hacky,因为每当我删除时我都在调整索引,我认为这只是因为我不像数据结构那样知识渊博。有人能给我一些建议吗?

注意 - 我不认为这个帖子被标记为重复,因为我不打算用我已经拥有的内容做有效的事情。对我来说,考虑到每次我从中得到我需要的东西时,我都会缩小双端队列的大小,这似乎是有效的。我所希望的是一些关于确定什么是我试图用deques做什么的最佳数据结构的建议,这些可能并不意味着我正在处理它们。

我也可能是错的,我的使用情况很好,但似乎对我不好。

1 个答案:

答案 0 :(得分:2)

好吧,我一直都知道this talk会派上用场!这里的消息是“知道您的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));
}