如何使用擦除删除成语从结构向量中擦除值?
How to erase value from vector of struct using erase-remove idiom?
如何从结构向量中删除所有值,其中结构值 k 等于 0?
struct tabuRecord {
int x;
int y;
int k;
tabuRecord( int x, int y, int k)
: x(x), y(y), k(k){}
};
vector <tabuRecord> tabu;
v.insert(v.begin(), tabuRecord(1, 2, 3));
v.insert(v.begin(), tabuRecord(4, 5, 0));
v.insert(v.begin(), tabuRecord(7, 8, 9));
v.insert(v.begin(), tabuRecord(10, 11, 0));
我试过了
tabu.erase(std::remove(tabu.begin(), tabu.end(), tabu.k=0), tabu.end());
和
tabu.erase(std::remove(tabu.begin(), tabu.end(), tabuRecord.k=0), tabu.end());
我猜您想做的是删除所有具有 k==0
的对象,因此为此创建一个 lambda:
tabu.erase(
std::remove_if(tabu.begin(), tabu.end(),[](const tabuRecord& t){return t.k == 0;}),
tabu.end());
std::remove
无法工作,因为它不是您要删除的一个值,而是具有特定模式的所有值,这就是 std::remove_if
所做的。
std::remove
需要一个 tabuRecord
来匹配,所以你需要做类似的事情。
tabuRecord value_to_remove(1,2,3);
tabu.erase(std::remove(tabu.begin(), tabu.end(), value_to_remove), tabu.end());
如果你只想根据k
成员删除,你需要使用std::remove_if
并传递一个适当的函数来匹配它。
auto match_func = [](const tabuRecord& obj) { return obj.k == 2; };
tabu.erase(std::remove_if(tabu.begin(), tabu.end(), match_func), tabu.end());
尝试这样的事情:
tabu.erase(
std::remove_if(tabu.begin(), tabu.end(), [valueToErase](const tabuRecord & t) {
return (t.x==valueToErase.x) && (t.y == valueToErase.y) && (t.k == valueToErase.k);
}), tabu.end());
如果三个字段相等,这将使用 lambda returns true
,并且在这种情况下删除所有值。
这是一个完整的例子:
#include <vector>
#include <algorithm>
#include <iostream>
int main(int argc, char **argv)
{
tabuRecord valueToErase(1, 2, 3); // example value to remove
tabu.push_back({ 1, 2, 3 });
tabu.push_back({ 4, 5, 6 });
tabu.push_back({ 1, 2, 3 });
tabu.push_back({ 7, 8, 9 });
tabu.erase(
std::remove_if(tabu.begin(), tabu.end(), [valueToErase](const tabuRecord & t) {
return (t.x==valueToErase.x) && (t.y == valueToErase.y) && (t.k ==
valueToErase.k);
}), tabu.end());
for (tabuRecord t : tabu) {
std::cout << "x: " << t.x << " y: " << t.y << " k: " << t.k << std::endl;
} // print all entries to verify that the correct ones were removed
return 0;
}
此外,您的构造器中有一个错误,您可能希望这样做而不是将所有字段设置为相同的值:
: x(x), y(y), k(k) {}
如何从结构向量中删除所有值,其中结构值 k 等于 0?
struct tabuRecord {
int x;
int y;
int k;
tabuRecord( int x, int y, int k)
: x(x), y(y), k(k){}
};
vector <tabuRecord> tabu;
v.insert(v.begin(), tabuRecord(1, 2, 3));
v.insert(v.begin(), tabuRecord(4, 5, 0));
v.insert(v.begin(), tabuRecord(7, 8, 9));
v.insert(v.begin(), tabuRecord(10, 11, 0));
我试过了
tabu.erase(std::remove(tabu.begin(), tabu.end(), tabu.k=0), tabu.end());
和
tabu.erase(std::remove(tabu.begin(), tabu.end(), tabuRecord.k=0), tabu.end());
我猜您想做的是删除所有具有 k==0
的对象,因此为此创建一个 lambda:
tabu.erase(
std::remove_if(tabu.begin(), tabu.end(),[](const tabuRecord& t){return t.k == 0;}),
tabu.end());
std::remove
无法工作,因为它不是您要删除的一个值,而是具有特定模式的所有值,这就是 std::remove_if
所做的。
std::remove
需要一个 tabuRecord
来匹配,所以你需要做类似的事情。
tabuRecord value_to_remove(1,2,3);
tabu.erase(std::remove(tabu.begin(), tabu.end(), value_to_remove), tabu.end());
如果你只想根据k
成员删除,你需要使用std::remove_if
并传递一个适当的函数来匹配它。
auto match_func = [](const tabuRecord& obj) { return obj.k == 2; };
tabu.erase(std::remove_if(tabu.begin(), tabu.end(), match_func), tabu.end());
尝试这样的事情:
tabu.erase(
std::remove_if(tabu.begin(), tabu.end(), [valueToErase](const tabuRecord & t) {
return (t.x==valueToErase.x) && (t.y == valueToErase.y) && (t.k == valueToErase.k);
}), tabu.end());
如果三个字段相等,这将使用 lambda returns true
,并且在这种情况下删除所有值。
这是一个完整的例子:
#include <vector>
#include <algorithm>
#include <iostream>
int main(int argc, char **argv)
{
tabuRecord valueToErase(1, 2, 3); // example value to remove
tabu.push_back({ 1, 2, 3 });
tabu.push_back({ 4, 5, 6 });
tabu.push_back({ 1, 2, 3 });
tabu.push_back({ 7, 8, 9 });
tabu.erase(
std::remove_if(tabu.begin(), tabu.end(), [valueToErase](const tabuRecord & t) {
return (t.x==valueToErase.x) && (t.y == valueToErase.y) && (t.k ==
valueToErase.k);
}), tabu.end());
for (tabuRecord t : tabu) {
std::cout << "x: " << t.x << " y: " << t.y << " k: " << t.k << std::endl;
} // print all entries to verify that the correct ones were removed
return 0;
}
此外,您的构造器中有一个错误,您可能希望这样做而不是将所有字段设置为相同的值:
: x(x), y(y), k(k) {}