我目前正在尝试使用结构的矢量/ 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做什么的最佳数据结构的建议,这些可能并不意味着我正在处理它们。
我也可能是错的,我的使用情况很好,但似乎对我不好。
答案 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
之间的所有内容都符合条件,而来自startedJobsIter
和end(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));
}