如何重载 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 class 的赋值运算符?

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

在我所知道的STL的实现中,很多函数都是在base 类中实现的,名字不详

确实有类似铸造运算符的东西:operator std::vector<int>() const 这需要添加到需要转换的类型中。但是,由于它也是图书馆的一部分,我认为您没有有效的选择。

要考虑的要点:

  1. operator=只能作为成员函数重载。
  2. 除非将函数声明为 class.
  3. 的成员函数,否则无法按照您的方式定义运算符函数
  4. 分配 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));