Алгоритм STL — C ++ Как искать, если элемент структуры в векторе равен?

Класс с именем SparseMatrix имеет вектор Nodeструктура Я хочу перегрузить += оператор, так что если i а также j члены экземпляра узла совпадают, тогда значение этого узла будет добавлено к This, Как я могу сделать это, используя методы из библиотеки алгоритмов?

Я пытался с помощью find_if передать функции, но она действует только на один итератор:

class SparseMatrix
{
public:
SparseMatrix(int numRow,int numCol, std::vector<double> fill);
SparseMatrix(int numRow,int numCol);
SparseMatrix();

// assignment operations
bool operator==(const SparseMatrix &other) const;
bool operator!=(const SparseMatrix &other) const;
void operator-() const;

// compound operations
SparseMatrix& operator+=(const SparseMatrix &other);
SparseMatrix& operator*=(const SparseMatrix &other);

// binary operations
const SparseMatrix operator+(const SparseMatrix &other) const;
const SparseMatrix operator*(const SparseMatrix &other) const;

friend std::ostream& operator<<(std::ostream& output, const SparseMatrix sparseMatrix);

bool trace(double& result) const;
bool det(double& result) const;
SparseMatrix transpose();

~SparseMatrix(){};protected:
vector<Node> _matrix;
int _numCol, _numRow;
};

typedef struct Node {
int i;
int j;
double value;
static bool samePosition(const Node& other)
{
return ((i == other.i) && (j == other.j));
}
} Node;SparseMatrix& SparseMatrix::operator+=(const SparseMatrix &other)
{
vector<Node>::iterator itThis;
for (vector<Node>::iterator itOther = other._matrix.begin(); itOther != other._matrix.end(); ++itOther)
{
// find if already exists a value in the same matrix position
itThis = find_if(_matrix.begin(), _matrix.end(), Node::samePosition);

// if exists add value to position, else instantiate new Node with value &  position
}

return *this;
}

По сути, я хочу, чтобы Node :: samePosition () передавал два параметра — текущий итератор, переданный find_if а также itOther так что он может проверить, равны ли они.

РЕДАКТИРОВАТЬ: Я отделил samePosition функция и теперь хочу передать ей два параметра, используя find_if:

typedef struct Node {
int i;
int j;
double value;
} Node;

static bool SparseMatrix::samePosition(const Node& first, const Node& other)
{
return ((first.i == other.i) && (first.j == other.j));
}

SparseMatrix& SparseMatrix::operator+=(const SparseMatrix &other)
{
vector<Node>::iterator itThis;
for (vector<Node>::iterator itOther = other._matrix.begin(); itOther != other._matrix.end(); ++itOther)
{
itThis = find_if(_matrix.begin(), _matrix.end(), SparseMatrix::samePosition("call what here?",itOther));
}

return *this;
}

0

Решение

Вы пытаетесь использовать

static bool SparseMatrix::samePosition(const Node& first, const Node& other)
{
return ((first.i == other.i) && (first.j == other.j));
}

которая является отдельной функцией. Все его данные должны быть предоставлены вызывающей стороной, но find_if ничего не знает о Node Вы хотите сравнить со всем списком.

Вместо этого вы должны использовать функтор, который является объектом, который может содержать некоторые данные, а также реализует operator()() так что он может быть вызван как функция.

struct position_finder
{
const Node needle;
position_finder( const Node& sought ) : needle(sought) {}
bool operator()( const Node& haystack ) const
{
return ((needle.i == haystack.i) && (needle.j == haystack.j));
// or return samePosition(needle, haystack)
}
};

и затем вы передаете искомый узел при построении функтора, так что он сохраняется для дальнейшего использования:

itThis = find_if(_matrix.begin(), _matrix.end(), position_finder(*itOther));

C ++ 11 делает все это намного проще, поскольку лямбда заставит компилятор сгенерировать эту структуру для вас:

itThis = find_if(_matrix.begin(), _matrix.end(), [itOther](Node& arg){ return ((itOther->i == arg.i) && (itOther->j == arg.j)); });
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]