找到预分配向量C ++的非空索引

时间:2014-06-26 06:04:15

标签: c++ vector

有没有简单的方法来查找预分配向量的非空条目的索引?
一种方法是简单地遍历向量。但是如果分配给vector的内存很大而且非空条目的数量非常少,那么它会非常慢 下面是示例代码。我有索引5,9,9,15的条目,现在的任务是从大小为indices的向量x中识别20 5,9,15。请建议一些简单的方法,甚至更好的数据结构,这将有所帮助。

#include "stdafx.h"
#include <string>
#include <iostream>
#include <vector>
using namespace std;

int main(int argc, char* argv[])
{
    vector <map<int,int>> x(20);
    x[5].insert({ 4,10002 });
    x[9].insert({2,20});
    x[9].insert({ 3, 60 });
    x[15].insert({ 11, 60 });

    return 0;
}

1 个答案:

答案 0 :(得分:0)

首先,我假设零条目是指空条目(没有元素的map)。

我认为不可能删除迭代成本,但可以将其从您想要识别这些索引的位置移动到程序的其他点(初始化,元素插入......)。 p>

例如,您可以在一个类中封装两个容器:您建议的向量,以及带有向量中空条目索引的set<size_t>。两者都不应该在课堂外直接访问(private)。您必须使用范围向量中的所有索引初始化集合(此处迭代)。应该通过类接口插入新元素以从集合中删除该索引。也删除了新元素(包括从任何条目的映射中删除元素,以检测它何时为空)。为了识别空条目索引,你可以在集合中拥有所有条目。

正如您所看到的,此方法将迭代成本从您想要识别空条目索引的点移动到初始化,从而将复杂性(和成本)添加到其他任何位置。

根据您的需要,使用的容器可能不同,或者这种方法可能根本没用。

更新:如果问题是查找空条目索引,则上述方法是正确的。要解决问题中的问题(识别非空入口索引),方法是:

  • 使用set<size_t>存储非空索引
  • 与初始化时的设备无关。
  • 插入新元素时,将该索引插入集合
  • 从向量中的任何地图中删除元素时,检查地图是否为空以删除该情况下的索引
  • 该集将包含非空条目的索引。