如何删除一组向量中的向量元素?

时间:2015-08-05 17:52:11

标签: c++ vector set

如果我有一组唯一的向量,我怎么能(例如)删除每个向量中的第二个元素?我创建了以下简单示例:

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向量中调用没有匹配的成员函数)
  • 使用迭代器(gives a similar error

3 个答案:

答案 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);
}