如果我有一组唯一的向量,我怎么能(例如)删除每个向量中的第二个元素?我创建了以下简单示例:
a <- subset(table, Response=="oxygen" & Operation=="blue" & Group %in% c("A", "B"))
此示例可以是compiled and run on cpp.sh。
我考虑过的可能解决方案:
#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";
}
}
;但是,这会在编译时出错(在const向量中调用没有匹配的成员函数)答案 0 :(得分:1)
我会使用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);
如果您正在处理大量数据,最好从输入集中获取一个向量,从输入集中删除它,从该向量中删除该元素,然后将结果插入到输出中。 / p>
答案 1 :(得分:0)
可能不是您正在寻找的解决方案,但您可以让您的设置保持指向矢量的指针。这对我有用:
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;
}
答案 2 :(得分:0)
在操作矢量之前和操作重新插入矢量之后,您需要从矢量集中移除矢量。
由于这会涉及很多创建/复制向量,您可以使用指向向量的指针 - 在这种情况下,您需要自己的比较函数对象:
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);
}