C++ C++;设计:实例和指针的容器

C++ C++;设计:实例和指针的容器,c++,pointers,containers,C++,Pointers,Containers,我在想些什么 我有一个类Polygon,它构成了一个向量行(这里是另一个类) 问题是: 我总是可以添加多边形(向量) 有没有比取消引用向量的每个元素并将其分配给现有向量容器更好的方法 //for line in vector<Line*> v //vcopy is an instance of vector<Line> vcopy.push_back(*(v.at(i)) //用于向量v中的行 //vcopy是vector的一个实例 vcopy.推回(*(v.at(i)

我在想些什么

我有一个类
Polygon
,它构成了一个向量
(这里是另一个类)

问题是:

我总是可以添加多边形(向量) 有没有比取消引用向量的每个元素并将其分配给现有向量容器更好的方法

//for line in vector<Line*> v
//vcopy is an instance of vector<Line>
vcopy.push_back(*(v.at(i))
//用于向量v中的行
//vcopy是vector的一个实例
vcopy.推回(*(v.at(i))
我想不是,但我真的不喜欢那种方法

希望我能够说服类的作者修改它,但是我现在不能根据这个事实编写代码(我害怕性能受到影响)


提前感谢。

这取决于你需要多久做一次,具体做得如何。有一种东西叫做转换迭代器,你可以制作一个这样的迭代器

vcopy( deref_iter( v.begin() ), deref_iter( v.end() ) );

会做你想做的事。但是,这并不比你现有的容易多少,一个简单的函数获取一个指针向量并返回一个对象向量将更容易实现和使用。

这取决于你需要多久做一次以及具体做多少。有一个转换迭代器,你可以这样的人

vcopy( deref_iter( v.begin() ), deref_iter( v.end() ) );
会做你想做的。但是,这并不比你拥有的容易,一个简单的函数获取指针向量并返回对象向量将更容易实现和使用。

你可以
转换()
容器:

struct deref { // NO! I don't want to derive, LEAVE ME ALONE!
    template<typename P>
    const P& operator()(const P* const p) const { return *p; }
};

// ...
    vector<Line*> orig; // assume full ...
    vector<Line> cp(orig.size());
    transform(orig.begin(), orig.end(), cp.begin(), deref());
struct deref{//不!我不想派生,别管我!
模板
常量P&运算符()(常量P*const P)常量{return*P;}
};
// ...
vector orig;//假设已满。。。
向量cp(原始大小());
转换(orig.begin(),orig.end(),cp.begin(),deref());
您可以
转换()
容器:

struct deref { // NO! I don't want to derive, LEAVE ME ALONE!
    template<typename P>
    const P& operator()(const P* const p) const { return *p; }
};

// ...
    vector<Line*> orig; // assume full ...
    vector<Line> cp(orig.size());
    transform(orig.begin(), orig.end(), cp.begin(), deref());
struct deref{//不!我不想派生,别管我!
模板
常量P&运算符()(常量P*const P)常量{return*P;}
};
// ...
vector orig;//假设已满。。。
向量cp(原始大小());
转换(orig.begin(),orig.end(),cp.begin(),deref());

可能重复的@Nathan:这是原件。@Potatocorn:不,甚至有一个早期的@Rahul:可能重复的问题被关闭了,但是当Nathan和Ben发表评论时,链接可能仍然有效。@Nathan:这是原件。@Potatocorn:不,甚至有一个早期的可能重复的问题。@Nathan:这是原件。@Potatocorn:不,有一个早期的可能重复的问题@Rahul的cate:Nathan和Ben发表评论时,这些问题已经解决了,但链接可能仍然有效。这看起来好多了。谢谢,我在找这样的东西。如果创建默认
对象很昂贵,那么不要传递
orig.size()
cp
的ctor。相反,将
cp
构造为空,然后调用
cp.reserve(orig.size())
。这将产生额外的代码行,但将避免初始化每个
对象(通过
的默认ctor,这可能是一个昂贵的操作)在
cp
@tomno中,
deref
不是模板。它是一个具有模板成员函数的常规结构。
transform()
算法不需要实例化模板
deref::operator()()
(即,它只工作(tm))因为编译器可以通过函数的参数推断模板参数。@Tom我没有从
std::unary_function
派生的原因(除了这个仪式的冗长性,我不喜欢),是为了传递
operator()()
用于
std::一元函数()
。然后,当您使用
deref
时,您必须实例化模板(这是最烦人的副作用!)正如您在上面的评论中所做的。对于一些typedef来说,所有这些工作都不值得。这看起来好多了。谢谢,我一直在寻找类似的东西。如果创建默认
对象很昂贵,那么不要传递
orig.size()
cp
的ctor。相反,将
cp
构造为空,然后调用
cp.reserve(orig.size())
。这将产生额外的代码行,但将避免初始化每个
对象(通过
的默认ctor,这可能是一个昂贵的操作)在
cp
@tomno中,
deref
不是模板。它是一个具有模板成员函数的常规结构。
transform()
算法不需要实例化模板
deref::operator()()
(即,它只工作(tm))因为编译器可以通过函数的参数推断模板参数。@Tom我没有从
std::unary_function
派生的原因(除了这个仪式的冗长性,我不喜欢),是为了传递
operator()()
用于
std::一元函数()
。然后,当您使用
deref
时,您必须实例化模板(这是最烦人的副作用!),就像您在上面的评论中所做的那样。对于一些typedef来说,所有这些工作都不值得。