gpt4 book ai didi

c++ - 克隆一个指针 vector ,我也能以某种方式克隆一个迭代器吗?

转载 作者:行者123 更新时间:2023-11-27 23:54:21 24 4
gpt4 key购买 nike

看看我的代码:

#include<vector>
#include<algorithm>
#include<iostream>
using namespace std;

class AbstractBase
{
protected:
int ident;
public:
virtual void add() = 0;
int getIdent()const {return ident;}
virtual ~AbstractBase(){};
virtual AbstractBase* clone()const =0;
};

class Derived1 :public AbstractBase
{
public:
Derived1(int i)
{
ident=i;
};
virtual void add() override
{
ident+=1;
}
virtual AbstractBase* clone() const override
{
return new Derived1 (*this);
}
};

class Derived2 :public AbstractBase
{
public:
Derived2(int i)
{
ident=i;
}
virtual void add() override
{
ident+=2;
}
virtual AbstractBase* clone() const override
{
return new Derived2(*this);
}
};

class cloneFunctor
{
public:
AbstractBase* operator() (AbstractBase* a) const
{
return a->clone();
}
};

struct IdentCompare
{
bool operator()(AbstractBase* f)
{
return f->getIdent() >5;
}
};

void WorkWithClonedVector(vector<AbstractBase*>origList,vector<AbstractBase*>::iterator it)
{
vector<AbstractBase*> tempList;
transform(origList.begin(),origList.end(),back_inserter(tempList),cloneFunctor());
//NEED TO FIND ITERATOR AGAIN-->ANY OTHER OPTION?
vector<AbstractBase*>::iterator tempIt=find_if(tempList.begin(),tempList.end(),IdentCompare());
(*tempIt)->add();
cout<<"local list:\n";
for(unsigned int i=0;i<tempList.size();++i)
{
cout<<"Element "<<(i+1)<<": "<<tempList[i]->getIdent()<<'\n';
delete tempList[i];
}
cout<<"Original Iterator still pointing to: "<<(*it)->getIdent()<<'\n';
tempList.clear();
}


int main()
{
Derived1 d1(1);
Derived1 d1b(2);
Derived2 d2(7);
Derived2 d2b(5);
vector<AbstractBase*> List;
List.push_back(&d1);
List.push_back(&d1b);
List.push_back(&d2);
List.push_back(&d2b);
vector<AbstractBase*>::iterator iter = find_if(List.begin(),List.end(),IdentCompare());
WorkWithClonedVector(List,iter);
cout<<"Original List not changed:\n";
for(unsigned int i=0;i<List.size();++i)
{
cout<<"Element "<<(i+1)<<": "<<List[i]->getIdent()<<'\n';
}
}

如您所见,我成功地克隆了一个 vector<AbstractBase*>WorkWithClonedVector 内为了安全地处理临时列表而不更改原始列表中的任何内容。我想知道是否有可能在 WorkWithClonedVector 的参数列表中“克隆”迭代器也是,所以我不需要使用 find_if两次?总结一下:如果参数列表中的迭代器指向原始列表的 third 元素,我也希望克隆的迭代器指向 third 元素的克隆列表。

最佳答案

在您的代码中,您可以改用:

auto tempIt = std::next(tempList.begin(), std::distance(origList.begin(), it));

或者,当您使用 std::vector

auto tempIt = tempList.begin() + (it - origList.begin());

Demo

请注意,您必须通过 (const)reference 传递 origList,否则 std::distance(origList.begin(), it)); 将是 UB 作为迭代器不属于同一范围。

关于c++ - 克隆一个指针 vector ,我也能以某种方式克隆一个迭代器吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43786450/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com