在两个向量的嵌套循环中使用迭代器来匹配元素并从向量中删除
Using iterators in nested loop through two vectors to match elements and erase from the vectors
我想使用以下循环来匹配两个向量中的元素,然后从向量中删除它们:
for(auto it1=left_unprocessed_event_arrays.begin(); it1!=left_unprocessed_event_arrays.end(); ++it1){
for(auto it2=right_unprocessed_event_arrays.begin(); it2!=right_unprocessed_event_arrays.end(); ++it2){
if(it1->header.stamp.nsec==it2->header.stamp.nsec){
matching_event_arrays.push_back({*it1,*it2});
left_unprocessed_event_arrays.erase(it1);
right_unprocessed_event_arrays.erase(it2);
}
}
}
然后我意识到我不能这样做,因为使用 erase()
会使迭代器无效。
搜索解决方案将我带到 this。这里有人建议使用 erase()
返回的指针,然后像这样递增 else
-bracket 中的迭代器:
std::vector<std::string>::iterator iter;
for (iter = m_vPaths.begin(); iter != m_vPaths.end(); ) {
if (::DeleteFile(iter->c_str()))
iter = m_vPaths.erase(iter);
else
++iter;
}
但是当我只在内循环递增时,它不会正确地通过外循环。我正在努力了解如何使它适用于我的嵌套循环。
所以我的问题是:如何实现嵌套循环的链接答案的解决方案?或者如果有 another/better 解决方案:那是什么?
看看这个例子,也许会有帮助:
int main()
{
vector<int> a = { 1, 2, 3, 7, 2 };
vector<int> b = { 2, 3, 4, 9 };
auto cmp = [&b](int x) {return std::find(b.begin(), b.end(), x) != b.end();};
while(1)
{
auto it = std::find_if(a.begin(), a.end(), cmp);
if(it == a.end())
break;
auto val = *it;
a.erase(std::remove(a.begin(), a.end(), val), a.end());
b.erase(std::remove(b.begin(), b.end(), val), b.end());
}
}
我会使用 goto
退出嵌套循环,如下所示:
for(auto it1=left_unprocessed_event_arrays.begin(); i1!=left_unprocessed_event_arrays.end();){
for(auto it2=right_unprocessed_event_arrays.begin(); it2!=right_unprocessed_event_arrays.end();){
if(it1->header.stamp.nsec==it2->header.stamp.nsec){
matching_event_arrays.push_back({*it1,*it2});
it1 = left_unprocessed_event_arrays.erase(it1);
it2 = right_unprocessed_event_arrays.erase(it2);
goto next;
}
++it2;
}
++it1;
next:;
}
使用标准算法可以阐明您想做什么并使控制流程简单明了(与 goto
不同):
for (auto it1 = left_unprocessed.begin(); it1 != left_unprocessed.end(); )
{
auto eventsMatch = [&event1 = *it1](const auto& event2) {
return event1.header.stamp.nsec == event2.header.stamp.nsec;
};
auto it2 = std::find_if(right_unprocessed.begin(), right_unprocessed.end(), eventsMatch);
if (it2 != right_unprocessed.end())
{
matching_event_arrays.push_back({*it1, *it2});
it1 = left_unprocessed.erase(it1);
right_unprocessed.erase(it2);
}
else
{
++it1;
}
}
我想使用以下循环来匹配两个向量中的元素,然后从向量中删除它们:
for(auto it1=left_unprocessed_event_arrays.begin(); it1!=left_unprocessed_event_arrays.end(); ++it1){
for(auto it2=right_unprocessed_event_arrays.begin(); it2!=right_unprocessed_event_arrays.end(); ++it2){
if(it1->header.stamp.nsec==it2->header.stamp.nsec){
matching_event_arrays.push_back({*it1,*it2});
left_unprocessed_event_arrays.erase(it1);
right_unprocessed_event_arrays.erase(it2);
}
}
}
然后我意识到我不能这样做,因为使用 erase()
会使迭代器无效。
搜索解决方案将我带到 this。这里有人建议使用 erase()
返回的指针,然后像这样递增 else
-bracket 中的迭代器:
std::vector<std::string>::iterator iter;
for (iter = m_vPaths.begin(); iter != m_vPaths.end(); ) {
if (::DeleteFile(iter->c_str()))
iter = m_vPaths.erase(iter);
else
++iter;
}
但是当我只在内循环递增时,它不会正确地通过外循环。我正在努力了解如何使它适用于我的嵌套循环。
所以我的问题是:如何实现嵌套循环的链接答案的解决方案?或者如果有 another/better 解决方案:那是什么?
看看这个例子,也许会有帮助:
int main()
{
vector<int> a = { 1, 2, 3, 7, 2 };
vector<int> b = { 2, 3, 4, 9 };
auto cmp = [&b](int x) {return std::find(b.begin(), b.end(), x) != b.end();};
while(1)
{
auto it = std::find_if(a.begin(), a.end(), cmp);
if(it == a.end())
break;
auto val = *it;
a.erase(std::remove(a.begin(), a.end(), val), a.end());
b.erase(std::remove(b.begin(), b.end(), val), b.end());
}
}
我会使用 goto
退出嵌套循环,如下所示:
for(auto it1=left_unprocessed_event_arrays.begin(); i1!=left_unprocessed_event_arrays.end();){
for(auto it2=right_unprocessed_event_arrays.begin(); it2!=right_unprocessed_event_arrays.end();){
if(it1->header.stamp.nsec==it2->header.stamp.nsec){
matching_event_arrays.push_back({*it1,*it2});
it1 = left_unprocessed_event_arrays.erase(it1);
it2 = right_unprocessed_event_arrays.erase(it2);
goto next;
}
++it2;
}
++it1;
next:;
}
使用标准算法可以阐明您想做什么并使控制流程简单明了(与 goto
不同):
for (auto it1 = left_unprocessed.begin(); it1 != left_unprocessed.end(); )
{
auto eventsMatch = [&event1 = *it1](const auto& event2) {
return event1.header.stamp.nsec == event2.header.stamp.nsec;
};
auto it2 = std::find_if(right_unprocessed.begin(), right_unprocessed.end(), eventsMatch);
if (it2 != right_unprocessed.end())
{
matching_event_arrays.push_back({*it1, *it2});
it1 = left_unprocessed.erase(it1);
right_unprocessed.erase(it2);
}
else
{
++it1;
}
}