在 std::list 中添加结构
Add struct in std::list
我有以下结构:
struct data {
std::string str;
int num;
int num2;
std::string str2
} data1;
我有一个std::list<struct data> list
;
我想在 std::list
中添加结构,假设没有这样的结构,请使用 std::find_if
和 lambda 函数。
std::list<data>::iterator it = std::find(list.begin(), list.end(), data1);
if (it == list.end()) list.push_back(data1)
你怎么做到的?
您没有正确声明 std::list
。确保仅指定数据类型。在这种情况下,声明应该是 std::list<data> list;
.
之后您可以创建 data
类型的对象并使用 push_back
.
将它们存储在 std::list
中
您可以迭代列表并将要添加的对象与现有对象进行比较,您可以通过比较所有数据成员来完成,如果它们匹配则对象相等。我会建议实现自定义比较运算符,而不是每次需要比较对象时都比较数据成员:
struct data
{
std::string str;
int num;
int num2;
std::string str2;
bool operator==(const data &d)
{
return this->num == d.num && this->str == d.str && this->num2 == d.num2 && d.str2 == this->str2;
}
};
用于 lambda 和 std::find_if()
:
data d{"string1", 2, 2, "string2"};
std::list<data>::iterator it = std::find_if(list.begin(), list.end(), [&](const data& dt) {
return d == dt;
});
if(it == list.end())
{
list.push_back(d);
}
请注意,正如评论部分中的 ,使用 std::find()
代替 std::find_if()
可以更轻松地实现这一点:
std::find(list.begin(), list.end(), d); // comparator implementation also needed
要使用 std::find_if
和 lambda:
std::list<data>::iterator it = std::find_if(list.begin(), list.end(),
[&data1](const data& rhs) {
return
data1.str == rhs.str &&
data1.num == rhs.num &&
data1.num2 == rhs.num2 &&
data1.str2 == rhs.str2;
}
);
在这种情况下,我建议定义 data::operator==
并改用 std::find
:
struct data {
std::string str;
int num;
int num2;
std::string str2;
bool operator==(const data& rhs) const {
return
str == rhs.str &&
num == rhs.num &&
num2 == rhs.num2 &&
str2 == rhs.str2;
}
};
std::list<data>::iterator it = std::find(list.begin(), list.end(), data1);
在 C++20 中,您可以通过默认 operator<=>
(宇宙飞船运算符)来简化它:
a defaulted <=>
overload will also allow the type to be compared with <
, <=
, >
, and >=
. If operator<=>
is defaulted and operator==
is not declared at all, then operator==
is implicitly defaulted.
鉴于此,以下是允许使用所有这些运算符比较 data
的方法:
struct data {
std::string str;
int num;
int num2;
std::string str2;
friend auto operator<=>(const data&, const data&) = default;
};
我有以下结构:
struct data {
std::string str;
int num;
int num2;
std::string str2
} data1;
我有一个std::list<struct data> list
;
我想在 std::list
中添加结构,假设没有这样的结构,请使用 std::find_if
和 lambda 函数。
std::list<data>::iterator it = std::find(list.begin(), list.end(), data1);
if (it == list.end()) list.push_back(data1)
你怎么做到的?
您没有正确声明 std::list
。确保仅指定数据类型。在这种情况下,声明应该是 std::list<data> list;
.
之后您可以创建 data
类型的对象并使用 push_back
.
std::list
中
您可以迭代列表并将要添加的对象与现有对象进行比较,您可以通过比较所有数据成员来完成,如果它们匹配则对象相等。我会建议实现自定义比较运算符,而不是每次需要比较对象时都比较数据成员:
struct data
{
std::string str;
int num;
int num2;
std::string str2;
bool operator==(const data &d)
{
return this->num == d.num && this->str == d.str && this->num2 == d.num2 && d.str2 == this->str2;
}
};
用于 lambda 和 std::find_if()
:
data d{"string1", 2, 2, "string2"};
std::list<data>::iterator it = std::find_if(list.begin(), list.end(), [&](const data& dt) {
return d == dt;
});
if(it == list.end())
{
list.push_back(d);
}
请注意,正如评论部分中的 std::find()
代替 std::find_if()
可以更轻松地实现这一点:
std::find(list.begin(), list.end(), d); // comparator implementation also needed
要使用 std::find_if
和 lambda:
std::list<data>::iterator it = std::find_if(list.begin(), list.end(),
[&data1](const data& rhs) {
return
data1.str == rhs.str &&
data1.num == rhs.num &&
data1.num2 == rhs.num2 &&
data1.str2 == rhs.str2;
}
);
在这种情况下,我建议定义 data::operator==
并改用 std::find
:
struct data {
std::string str;
int num;
int num2;
std::string str2;
bool operator==(const data& rhs) const {
return
str == rhs.str &&
num == rhs.num &&
num2 == rhs.num2 &&
str2 == rhs.str2;
}
};
std::list<data>::iterator it = std::find(list.begin(), list.end(), data1);
在 C++20 中,您可以通过默认 operator<=>
(宇宙飞船运算符)来简化它:
a defaulted
<=>
overload will also allow the type to be compared with<
,<=
,>
, and>=
. Ifoperator<=>
is defaulted andoperator==
is not declared at all, thenoperator==
is implicitly defaulted.
鉴于此,以下是允许使用所有这些运算符比较 data
的方法:
struct data {
std::string str;
int num;
int num2;
std::string str2;
friend auto operator<=>(const data&, const data&) = default;
};