在向量的一列中查找不在另一列中的元素

时间:2013-10-30 11:37:32

标签: c++ vector

这个片段的主要目的是我需要一种方法来查找向量的一列而不是另一列中存在的所有元素,然后是下一个,依此类推。

我有一个向量,其内容将始终是预先排序的,并且将始终是唯一的字符串(基于每列),这些字符串是从其中填充的文件的性质。

在运行时计算大小变量,rowa(行)和fnamec(列)。 每列表示从文件导入的数据。第0列=文件1,第1列=文件2等。
文件数量与每个包含的行数不同。 在处理文件时,我将每个行中的行数存储在一个数组中以便引用,所以我没有按空行。

我的数组是如此设置的,其中包含我将如何填充它的测试数据:

    std::vector<std::vector<string> > array(rowa, std::vector<string>(fnamec));

[0,0]apple   [0,1]apple [0,2]banana
[1,0]banana  [1,1]banana[1,2]bean
[2,0]cucumber[2,1]bean  [2,2]grape
[3,0]grape   [3,1]carrot[3,2]pear
[4,0]        [4,1]grape [4,2]tomato
[5,0]        [5,1]pear  [5,2]
[6,0]        [6,1]tomato[6,2]
[7,0]        [7,1]      [7,2]

使用示例数据,执行返回:

cucumber not in next column

apple not in next column
carrot not in next column

(因为它会将第1列与第2列和第2列与第3列进行比较等)

    int ksrow = 0;                                          // Source row                                                                             
    int kscol = 0;                                          // Source column. We start at [0,0]        
    int ktrow = 0;                                          // Target row
    int ktcol = 1;                                          // Target column. We start at [0,1]
    int colmatch = 0;                                       // Set match(?) initially to no

for(int kloop = 0; kloop < fnamec-1; ++kloop)               // Check all columns against next...
    {
    int ksqty = rarray[kscol][0];                           // rarray is where row sizes are stored
    int ktqty = rarray[ktcol][0];                           

    for(int kcol = 0; kcol < ksqty; ++kcol)                 // Check all individual names from A in all of B...
        {
        for(int krow = 0; krow < ktqty; ++krow)             // Check if individual name exists in all of B
            {
            if(array[ksrow][kscol] == array[krow][ktcol])   // Check if a column matches
                {
                colmatch = 1;                               // Set match flag to true   
                }
            }
            if (colmatch == 0)                              // If match not true then...
                {
  cout << array[ksrow][kscol] << " not in next column" << endl;    // ...display unmatched entry
                }
        colmatch = 0;                                       // Reset match flag
        ksrow++;                                            // Increment source row
        }
        cout << "\n" << endl;                               // Add newline to display to separate list views
    ksrow = 0;                                              // Reset source row
    kscol++;                                                // Increment source column
    ktrow = 0;                                              // Reset target row
    ktcol++;                                                // Increment target column
    }

按原样,代码似乎正常工作,我只是不确定我提出的是最有效的方法,尤其是当它应用于更大的数据集时。 (这就是为什么我还提到了如何将数据设置为更好的解决方案的原因)。

我的下一步也是让它显示相反的元素,已经添加而不是丢弃的元素但是我想在我可能为自己做更多的工作之前先把它扼杀在萌芽状态,如果大修是必要。

0 个答案:

没有答案