找到2D向量的位置,它是C ++类的一个元素

时间:2018-06-11 20:09:40

标签: c++ c++11 search multidimensional-array stdvector

我正在研究一个类,我在查找类的一个元素中的值位置时遇到了一些问题。我已经按如下方式定义了我的课程:

typedef class Chrom                                         
{
 public:
    vector<vector < int>> bit;                  
    vector<vector < bool>> jobisconsidered;

    vector<vector <float>> WaitingTime; 
    void variablesresize()
    {
        int i = 0, j, k;
        float a;

        std::vector<float> datapoints;
        std::ifstream myfile("Input.dat", std::ios_base::in);

        i = 0;                   //making zero counter of characters                        
        myfile.open("Input.dat");//now we reread numerical values                       

        while (!myfile.eof())
        {
            myfile >> a;
            //  cout << "i=" << i << '\n';              
            if (!myfile) // not an int                  
            {
                myfile.clear(); // clear error status               
                myfile.ignore(1); // skip one char at input             
            }
            else
            {
                datapoints.push_back(a);
                ++i;
            }
        }

        myfile.close();

        Jobs = datapoints[0];
        Machines = datapoints[1];

        WaitingTime.resize(Machines);
        bit.resize(Machines);

        for (int i = 0; i < Machines - 1; ++i)  WaitingTime[i].resize(Jobs);

        bit[i].resize(Jobs);
        }
    }
} c;

c popcurrent[50];

在类中,bit是2D元素,如果我将其定义为m*n,则行中的所有值都相同。但是,当我想在bit中查找位置时,例如,如果popcurrent[0].bit代表2行3列= { {3,2,1},{3,2,1} },我想找到第一个“{{1}的位置“在向量中是0和3,我有问题。

具体来说,我使用以下命令尝试c++ search a vector for element first seen position

popcurrent[0].bit[0][0]=3

但我得到以下错误:

auto p = std::lower_bound(popcurrent[0].bit.begin(), popcurrent[0].bit.end(), 1);
int position = p - popcurrent[0].bit.begin();

我知道一种方法是使用for和if循环。但我想知道是否还有更多的自动化方法,例如内置函数。

2 个答案:

答案 0 :(得分:3)

我一开始并没有注意到它 - 那里有太多不相关的代码 - 但问题很简单:你正试图找到std::vector<int>类型的第一个元素而不是小于int类型的值。

popcurrent[0].bit.begin()指向std::vector<std::vector<int>>的第一个元素,即向量。没有&#34;少于&#34;用于比较整数向量和一个int的运算符。

答案 1 :(得分:1)

  

我想找到第一个&#34; 3&#34;的位置。在向量中是0和   popcurrent[0].bit[0][0] = 3,我有问题。具体我试过了   c ++使用以下内容搜索元素首次看到位置的向量   命令:

auto p=std::lower_bound(popcurrent[0].bit.begin(), popcurrent[0].bit.end(), 1);
int position = p - popcurrent[0].bit.begin();

主要有两个问题:

问题 - 1: std::lower_bound采用参数firstlast,它们是定义部分有序范围的前向迭代器类型。在你的情况下(popcurrent[0].bit.begin()),你传递一个迭代器,它的尖头元素为一个整数向量(记住std::vector<std::vector<int>>是一个向量数组{{1 } {}非整数)vector<int>找不到std::lower_bound的任何定义。这就是你的错误的原因,编译器在抱怨:

&#34; 嘿,我没有operator<给定范围的专业化  或矢量,以实例化模板 &#34;

问题 - 2:你不能在这里使用operator<,因为它需要一个严格排序的数组来二进制搜索已经提供的值。由于您提供了未分类的向量来检查,结果不会是正确的。请参阅以上链接以了解更多信息:

解决方案:您可以使用时间复杂度为std::find_ifSEE LIVE HEREstd::lower_bound与{{1}之间的距离最高为线性根据提供的first,迭代器将搜索每个元素,直到找到匹配为止。如果您不想对类中的每个向量进行排序(这实际上是向量的三维数组),这可能是一种替代方法。

以下是一个示例解决方案:https://github.com/kubernetes/kubernetes/blob/de8cc313554b7f7d41509ca620f71439cd8729eb/cmd/kubelet/app/options/options.go#L281-L293

last

输出:

predicate