繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM