这个片段的主要目的是我需要一种方法来查找存在于向量的一列中但不存在于另一列中的所有元素,然后是下一列,依此类推。
我有一个向量,其内容将始终被预先排序,并且始终是唯一的字符串(在每列的基础上),这取决于填充它们的文件的性质。
大小变量 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
}
照原样,代码似乎可以正常工作,我只是不确定我想出的是最有效的方法,特别是如果/当它应用于更大的数据集时。(这就是为什么我还提到了我如何设置数据以防这些因素成为更好的解决方案)。
我的下一步将是让它也显示相反的元素,添加而不是删除的元素,但我想我会先把它扼杀在萌芽状态,然后如果有必要进行大修,我可能会为自己做更多的工作。