c++ - 清除 vector 中的重复对象会产生无限循环

标签 c++ vector

我有一个 vector 叫做:

vector<MiniPair> miniPairVector;

MiniPair对象内部有2个属性,1个是整数docNumber,另一个是字符串word

我正在尝试清除此 vector 中的重复项,这意味着如果 docNumber 和 word 存在于 vector 中的另一个对象中,则删除重复项

这是我尝试过的方法,但它会产生无限循环:

for (int i = 0; i < miniPairVector.size(); i++) {

    for (int k = i + 1; k < miniPairVector.size(); k++) {

        if (miniPairVector[i].getDocNumber() == miniPairVector[k].getDocNumber() && miniPairVector[i].getWord() == miniPairVector[k].getWord()) {
            cout << "i am erasing" << endl;
            miniPairVector.erase(miniPairVector.begin() + k);

        }

    }

}

这是迷你对类:

#pragma once
// classes example
#ifndef MINIPAIR_H
#define MINIPAIR_H
#include <iostream>
using namespace std;

class MiniPair {
    friend bool operator<(MiniPair const &a, MiniPair const &b) {

        return a.docNumber < b.docNumber || a.docNumber == b.docNumber && a.word < b.word;
    }
    friend bool operator==(MiniPair const &a, MiniPair const &b) {

        return a.docNumber == b.docNumber && a.word == b.word;
    }
private:
    string word;
    int docNumber;

public:
    MiniPair();
    MiniPair(string word, int docNumber);
    string getWord();
    int getDocNumber();

};
#endif

最佳答案

我的假设是您正在为类做这件事。

首先,虽然由于类强加的约束,这可能与您正在解决的问题无关,但这是一种糟糕的实现方式。如果正确实现,比较次数将类似于 miniPairVector.size() * miniPairVector.size()。 .这是很多比较,比您实际需要的要多得多。

如果我尝试在非玩具(或非作业)程序中执行此操作,我会使用 <algorithm>标准库的一部分。我会用 ::std::sort然后 ::std::unique .

下面是我将如何使用这两个来做到这一点:

#include <algorithm>

void remove_dupes(::std::vector<MiniPair> &minipair_vec)
{
    ::std::sort(minipair_vec.begin(), minipair_vec.end(),
                [](MiniPair const &a, MiniPair const &b) -> bool {
                    return (a.getDocNumber() < b.getDocNumber())
                           || ((a.getDocNumber() == b.getDocNumber())
                               && (a.getWord() < b.getWord())));
               }); // End lambda and sort.
     auto newend = ::std::unique(minipair_vec.begin(), minipair_vec.end(),
                                [](MiniPair const &a, MiniPair const &b) -> bool {
                                   return a.getDocNumber() == b.getDocNumber()
                                          && a.getWord() == b.getWord();
                                }); // End lambda and unique.
     minipair_vec.resize(newend - minipair_vec.begin());
}

我已经测试过了,所以它应该可以正常工作。

一般的教训是,如果你发现自己在循环,请完成这组问题:

  • 我是否在为线性数据结构编制索引?如果是这样,我为什么要使用索引而不是迭代器?
  • 是否有一种算法已经可以满足我的需求,或者可以轻松组合几种算法来满足我的需求?

我提供的代码应该在与 minipair_vec.size() * ::std::log2(minipair_vec.size()) 成正比的时间内运行.您编写的代码将在与 minipair_vec.size() * minipair_vec.size() 成正比的时间内运行(一旦你让它工作),这对于一个大列表来说要长得多。

关于c++ - 清除 vector 中的重复对象会产生无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53253642/

相关文章:

c++ - 指针的地址是什么意思?

c++ - 如何合并两个包含 std::unique_ptr 的 vector ?

matlab - 使用另一个变量对单个箭袋箭头进行颜色编码

C++ 如何打印复合 vector 的内容

c++ - 指针打印问题

c++ - 全局 new 和 delete 运算符的定义

c++ - 使用 getline 在运行时获取与文件输入相关的错误

C++:如何在不定义的情况下声明非函数?

java - 需要一些关于简短 Java 代码的帮助/建议

c++ - 不匹配调用 '(std::pair<unsigned int, unsigned int>) (unsigned int&, unsigned int)'