【问题标题】:Comparing unsorted elements in two vectors比较两个向量中未排序的元素
【发布时间】:2018-04-19 01:50:43
【问题描述】:

我是 C++ 新手,我正在尝试将两个未排序的向量元素相互比较并确定它们是否匹配。

例如: 1 4 9 16 9 7 4 9 11 和 11 11 7 9 16 4 1 这些将被视为匹配。

我尝试过使用 firstVector == secondVector,但是当它们的向量未排序时不起作用,我特别想在它们未排序但正在苦苦挣扎时比较它们。

int main() {
int incorrectMatches = 0;
int totalMatches = 0;
int input = 0;
vector <int> firstVector;
vector <int> secondVector;

do {
    cout << "Please enter a number for first vector:  ";
    cin >> input;
    firstVector.push_back(input);
    cout << endl;
} 

while (input > 0);

input = 0;

firstVector.pop_back();

do {
    cout << "Please enter a number for second vector: ";
    cin >> input;
    secondVector.push_back(input);
    cout << endl;
} 

while (input > 0);


secondVector.pop_back();



for (int loop = 0; loop < firstVector.size(); loop++) {
    cout << firstVector[loop] << " ";
}

cout << endl;
for (int loop = 0; loop < secondVector.size(); loop++) {
    cout << secondVector[loop] << " ";
}

cout << endl;
int vectorSize = firstVector.size();

for (int i = 0; i < vectorSize; i++) {
    if (firstVector[i] == secondVector[i]) {
        totalMatches = totalMatches++;
    }
    else {
        incorrectMatches = incorrectMatches++;
    }
}

cout << "There were " << totalMatches << " matches." << endl;

cout << "There were " << incorrectMatches << " incorrect matches";

/*
if (firstVector == secondVector) {
    cout << "Your vectors match!";
}

else{
    cout << "Your vectors don't match!";
}

*/
/*
for (int i = 0; i < input; i++) {
    cout << "Please enter a number (1-9): ";
    myVector.push_back(input);
    cout << endl;

    myVector[i] = i;

    cout << "Vector entry: " << myVector[i] << endl;

}

*/

system("pause");
return 0;}

【问题讨论】:

  • 用std::sort 对两者进行排序,然后将它们与== 进行比较怎么样?它与大多数其他策略一样有效(常见的例外是使用std::unordered_map&lt;int, unsigned int&gt; 来计算频率)并且非常易于阅读。
  • 不知道如何在不排序的情况下有效地做到这一点......
  • 您需要一个有效的解决方案,还是只需要一个有效的解决方案?
  • @OznOg:简单。使用地图,计算第一个向量的元素,不计算第二个向量的元素。如果地图中的计数不为 0,则向量不相等。 (您可以从那里进行一些优化,但这是基本算法。)

标签: c++ vector


【解决方案1】:

由于重复无关紧要,您可以简单地将向量的元素分别插入单独的std::set,然后使用operator == 比较集合。我认为集合的使用最能表达您的程序的意图:

int main() {

    vector<int> v1 =  { 1, 4, 9, 16, 9, 7, 4, 9, 11 };
    vector<int> v2 =  { 11, 11, 7, 9, 16, 4, 1 };

    set<int> s1;
    s1.insert(v1.begin(), v1.end());

    set<int> s2;
    s2.insert(v2.begin(), v2.end());

    bool isEqual = (s1 == s2);
    cout << "v1 and v2 are " << (isEqual ? "" : "not ") << "equal." << endl;

    return 0;

}

【讨论】:

  • 复制到vector 并使用sort 通常比复制到set 更有效。
  • @Mark Ransom:从 OP 给出的示例来看,问题在于比较集合。所以我更喜欢这个解决方案,而不是一个更有效但可能不太直观的解决方案。但是,当然,如果结果证明集合的使用会变慢 - 只有分析器会显示这会出现问题 - 人们可以考虑更有效的解决方案。
  • 这是我以前没有注意到的问题中的一个微妙之处。我的方法在这种情况下不起作用,它不会消除重复。
猜你喜欢
  • 1970-01-01
  • 2023-03-09
  • 2018-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多