【问题标题】:Not sure what data structure to use不确定使用什么数据结构
【发布时间】:2016-03-03 20:24:24
【问题描述】:

我目前正在尝试使用结构的向量/双端队列。简单的结构示例...

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

这可以按我的意愿工作,但它似乎也很笨拙,因为每当我删除时我都会调整索引,我认为这仅仅是因为我没有像应有的数据结构那样知识渊博。谁能给我一些建议?

注意 - 我不认为这与这篇文章的标签内容重复,因为我不想用我已经拥有的东西有效地做某事。对我来说,考虑到每次我从中得到我需要的东西时我都会减小双端队列的大小,这似乎足够有效。我所希望的,是一些关于找出什么是我正在尝试使用双端队列的最佳数据结构的建议,这在我处理它们时可能不会被处理。

我也可能是错的,我的用法很好,但对我来说似乎是这样。

【问题讨论】:

  • 好的,谢谢乔恩!我去看看
  • 嗨滴。我正在寻找一个更好的结构来处理我目前对双端队列所做的事情。我也不需要订单是什么,因为这些结构有我需要的订单信息。不过看起来不错,所以我会仔细阅读它
  • 您可能想要查看具有固有排序的std::multiset(尽管您需要告诉它jobs 是按job.time 排序的)。擦除元素也应该很容易。

标签: c++ data-structures


【解决方案1】:

嗯,我一直都知道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));
}

【讨论】:

  • 好的,谢谢纳赛尔!我也会看看你的演讲!出于好奇,这都是 C++11 吗?我不认为这对我有用。我在问,因为我注意到 youtube 视频的缩略图显示 C++11
  • 我确实在这里使用了 C++11 的东西,但 stable_partitionpartition 都不是 C++11,您可以将此解决方案调整为旧的 C++ 标准。
  • 嗯。我很惊讶地看到 std::stable_partition 用于此目的。我期待std::remove_if
  • @MooingDuck 也可以。你觉得使用stable_partitionpartition 比使用remove_if 有什么缺点吗?如果您愿意,请随时提交修改。
  • @Nasser:老实说,我刚刚花了最后 10 分钟试图弄清楚它们之间是否有任何区别。然后我放弃并进行了 SO 搜索:“remove_if 和 partition 都将“好”元素放在首位。partition 将“坏”元素放在后面,而 remove_if 没有指定它后面的内容——它可能是坏元素,但它也可能是任何(好的或坏的)元素的副本。” stackoverflow.com/questions/3521352/…我还没有意识到它们有多相似。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-07
  • 1970-01-01
  • 2019-11-24
相关资源
最近更新 更多