繁体   English   中英

如何重载std :: vector :: operator =()

[英]How to overload std::vector::operator=()

我需要分配类型std :: vector = arma :: vec,即将犰狳数学库中的向量分配给std :: vector。

template <typename T>
std::vector<T>& std::vector<T>::operator=(arma::vec right) {
  std::size_t s(right.size());
  this->resize(s);
  for (std::size_t i = 0; i < s; i++)
    *this[i] = right(i);
  return *this;
}

我尝试过这种方式,但编译器不同意: error: invalid use of incomplete type 'class std::vector<_RealType>'

是否可以重载std :: vector类的赋值运算符?

不,这是不可能的。 如果您扩展了std命名空间,则甚至是未定义的行为,除非这些符号的标准明确允许。 就是说,我看不到编译器会投入资源来跟踪它。 但是,它可能与已经使用的符号冲突。

在我所知道的STL的实现中,很多功能都是在具有未指定名称的基类中实现的。

确实包含类似转换运算符的内容: operator std::vector<int>() const这需要添加到需要转换的类型中。 但是,由于它也是库的一部分,所以我认为您没有有效的选择。

要考虑的要点:

  1. operator=只能作为成员函数重载。
  2. 除非将函数声明为类的成员函数,否则无法以自己的方式定义运算符。
  3. 分配arma::vec很容易。 使用它们而不是尝试定义oprator=重载。

示例代码演示了如何将不同种类的容器分配给std::vector

#include <iostream>
#include <vector>
#include <set>

int main()
{
   std::vector<int> a;
   int b[] = {1, 2, 3, 4, 5};
   std::set<int> c{10, 20, 30, 40, 50};

   a = {std::begin(b), std::end(b)};

   for ( int el : a )
   {
      std::cout << el << " ";
   }

   std::cout << std::endl;

   a.assign(std::begin(c), std::end(c));

   for ( int el : a )
   {
      std::cout << el << " ";
   }

   std::cout << std::endl;
}

在您的情况下,可以使用以下任一方法:

std::vector<YourType> v;
v = {std::begin(right), std::end(right)};
v.assign(std::begin(right), std::end(right));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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