通过复制分配在不同对象的容器之间实现自动化

Automation between containers of different objects with copy assign

提问人:Chameleon 提问时间:3/21/2013 更新时间:3/22/2013 访问量:123

问:

我有一个稀疏向量,其中 SparseElement 是:std::vector<SparseElement<T,I>>

template<typename T, typename I = unsigned int>
struct SparseElement
{
    I index;
    T value;
    //............
    SparseElement &operator=(const std::pair<I,T> &pair);
 }

因为我使用来填充具有元素的稀疏向量 a,所以我想要一个解决方案,而无需更改 SparseElement 的“index”和“value”成员:std::map<I,T>std::pair<I,T>

std::pair<I,T> a;
SparseElement<T,I> b;
b = a; // This is OK!
a = b; // Is there a solution on this problem?
// on containers:
std::vector<SparseElement<T,I>> vec;
std::map<I,T> m(vec.begin(), vec.end()); // Not working.
vec.assign(m.begin(), m.end()); // Working.
C++ 容器 构造函数 复制 赋值

评论

0赞 RedX 3/21/2013
a = b;也许作为一个免费功能。template<class I, class T> std::pair<I,T>& operator=(pair<I,T> lhs, SparseElement<T, I> const & SE);
0赞 Kiril Kirov 3/21/2013
@RedX - 不,我也爱上了。 必须是标准定义的非静态成员函数。operator=
0赞 RedX 3/21/2013
@KirilKirov当,如果可能的话,那就太好了。
2赞 RedX 3/21/2013
然后,也许将成员转换成员添加到 SparseElement 类中。operator std::pair<I,T>()
0赞 Kiril Kirov 3/21/2013
@RedX - 很好,这应该有效。

答:

0赞 Chameleon 3/22/2013 #1

重写答案以帮助社区

template<typename T, typename I = unsigned int>
struct SparseElement
{
    //..........
    I index;                //!< Index of element in vector
    T value;                //!< Value of element
    //..........
    //! Template copy constructor from a different type of \p std::pair
    //! This is useful for conversion from MapVector to SparseVector
    template<typename T2, typename I2>
    SparseElement(const std::pair<I2,T2> &s) : index(s.first), value(s.second) {}
    //..........
    //! Template copy assign from a different type of \p std::pair
    //! This is useful for conversion from MapVector to SparseVector
    template<typename T2, typename I2>
    SparseElement &operator=(const std::pair<I2,T2> &s) { index = s.first; value = s.second; return *this; }

    //! Implicit conversion from SparseElement to a \p std::pair
    //! This is useful for conversion from SparseVector to MapVector
    operator std::pair<const I,T>() { return std::pair<const I,T>(index, value); }
};