[英]How can I remove elements of vectors in a set of vectors?
如果我有一组唯一的向量,如何(例如)删除每个向量中的第二个元素? 我创建了以下简单示例:
#include <iostream>
#include <vector>
#include <set>
#include <string>
using namespace std;
int main()
{
vector<int> myVec1 = {0, 1, 2, 3, 4, 5};
vector<int> myVec2 = {3, 5, 7, 2, 4, 1};
vector<int> myVec3 = {2, 5, 3, 8, 6, 9};
set<vector<int>> mySet;
mySet.insert(myVec1);
mySet.insert(myVec2);
mySet.insert(myVec3);
// right now this for loop deletes an element from a copy only
for(auto item : mySet) item.erase(item.begin() + 2);
for(auto item : mySet)
{
for(auto element : item) cout << " " << element;
cout << "\n";
}
}
该示例可以编译并在cpp.sh上运行 。
我考虑过的可能解决方案:
for(auto& item : mySet)
; 但是,这会在编译时产生错误(在const向量中没有匹配的成员函数可用于调用) 我将使用std::transform
从现有集中获取数据,根据需要进行修改,然后将结果插入新集中,然后将旧集中交换为新集中:
std::set<std::vector<int> > mySet {
{0, 1, 2, 3, 4, 5},
{3, 5, 7, 2, 4, 1},
{2, 5, 3, 8, 6, 9}
};
std::set<std::vector<int>> temp;
std::transform(mySet.begin(), mySet.end(),
std::inserter(temp, temp.end()),
[](std::vector<int> s) { s.erase(s.begin() + 1); return s; }
);
std::swap(temp, mySet);
如果要处理大量数据,则最好从输入集中获取向量,从输入集中擦除向量,从该向量擦除元素,然后将结果插入输出。
可能不是您正在寻找的解决方案,但是您可以让集合保留指向矢量的指针。 这对我有用:
int main() {
vector<int> myVec1 = {0, 1, 2, 3, 4, 5};
vector<int> myVec2 = {3, 5, 7, 2, 4, 1};
vector<int> myVec3 = {2, 5, 3, 8, 6, 9};
set<vector<int>*> mySet;
mySet.insert(&myVec1);
mySet.insert(&myVec2);
mySet.insert(&myVec3);
for(vector<int>* item : mySet) item->erase(item->begin() + 2);
for(vector<int>* item : mySet)
{
for(auto element : *item) cout << " " << element;
cout << "\n";
}
return 0;
}
在操作之前以及在操作重新插入向量之后,您需要从向量集中删除该向量。
由于这将涉及很多创建/复制向量,因此您可以使用指向向量的指针-在这种情况下,您将需要自己的compare函数对象:
struct compare
{ bool operator()(
const std::shared_ptr<std::vector<int> > &_r0,
const std::shared_ptr<std::vector<int> > &_r1) const
{ return *_r0 < *_r1;
}
};
std::set<std::shared_ptr<std::vector<int> >, compare> sSet;
为了删除每个向量中的第二个元素,我将首先创建所有指针的副本:
std::vector<std::shared_ptr<std::vector<int> > > sCopy(
sSet.begin(),
sSet.end());
sSet.clear();
for (auto p = sCopy.begin(), pEnd = sCopy.end();
p != pEnd;
++p)
{ auto rVectorPtr = *p;
if (rVectorPtr->size() > 1)
rVectorPtr->erase(rVectorPtr->begin() + 1);
sSet.insert(rVectorPtr);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.