gpt4 book ai didi

c++如何搜索 vector 中的结构元素是否相等?

转载 作者:行者123 更新时间:2023-11-28 00:50:30 25 4
gpt4 key购买 nike

名为 SparseMatrix 的类具有 Node 结构的 vector 。我想重载 += 运算符,以便如果 Node 实例的 ij 成员相同,则该节点的值将添加到 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_ifitOther 传递的当前迭代器,以便它可以检查它们是否相等。

编辑:我已经分离了 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;
}

最佳答案

你正在尝试使用

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 使这一切变得更容易,因为 lambda 将使编译器为您生成该结构:

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

关于c++如何搜索 vector 中的结构元素是否相等?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14344583/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com