运算符<<矢量重载

operator<< overload for vector

本文关键字:lt 重载 运算符      更新时间:2023-10-16

我尝试了在网上找到的以下代码,并且运行良好。

template<typename T,typename T2>
std::vector<T>& operator<<(std::vector<T>& v1, T2 t1){
v1.push_back(T(t1));
return v1;
} 

但对我来说,参数 t1 必须来自类型 T 而不是 T2。所以我的第一个问题是:为什么当我这样做时

std::vector<T>& operator<<(std::vector<T>& v1, ***T t1***) //instead of T2 t1

我有以下错误: 错误:与"运算符<<"不匹配(操作数类型为"std::vector>"和"std::string {aka std::basic_string}")

我的第二个问题是代码的 ligne 4: T(t1) 是什么意思?

多谢!

编辑:

感谢您的所有回答!

这是我用来测试和尝试输入函数的代码。

using namespace std; 
template<typename T>
std::vector<T>& operator<<(std::vector<T>& v1, T t1){
v1.push_back(T(t1));
return v1;
} 
int main()  {
vector<string> s;
string s2(" hello ");
s << s2 ;
cout<< s[0];
return 0;}

所以 T 是字符串,v1 是 vector(字符串)类型,t1 是字符串类型 这就是为什么我想知道为什么从模板中删除类型名 T2 会导致错误,即使两者的value_type都是字符串

我尝试了在网上找到的以下代码,并且运行良好。

template<typename T,typename T2>
std::vector<T>& operator<<(std::vector<T>& v1, T2 t1){
v1.push_back(T(t1));
return v1;
}

我不会说这很完美:

  • 函数参数t1接受,这意味着创建调用方值的副本。 这有时效率很低。 C++具有所谓的移动语义,可以在可能的情况下自动有效地重用值,您可以获得如下好处:

    template <typename T, typename T2>
    std::vector<T>& operator<<(std::vector<T>& v, T2&& t){
    v.emplace_back(std::forward<T2>(t));
    return v;
    }
    
  • <<已经有两个常见的用途:按位移位和输出流;添加第三个会成倍增加混乱。 有vector<int> v的人可能会假设v << 3将所有现有元素位移 3,有vector<string> w的人可能会假设w << '.'会为当前存储的每个字符串附加一个句号,其他人可能希望它创建一个由 '." 连接的现有元素的字符串。s - 所有这些希望/期望都与您提出的一样合理,因此任何阅读客户端代码的人都必须足够开放,以意识到操作不清楚,然后深入研究以找出您的<<函数实际在做什么。

但对我来说,参数 t1 必须来自类型 T 而不是 T2。 所以我的第一个问题是:为什么当我这样做

std::vector<T>& operator<<(std::vector<T>& v1, ***T t1***) //instead of T2 t1

考虑vector<double> v; v << 2;作品,即使2int而不是double。 如果没有您的单个模板参数,它将无法工作。

我有以下错误:错误:与"运算符<<"不匹配(操作数类型为"std::vector>"和"std::string {aka std::basic_string}")

您的错误消息是乱码,您(尚未)发布源代码,所以我不能说您在那里做错了什么......

即使你没有明确要求,我的水晶球告诉我你会对std::insert_iterator感兴趣。在容器(向量、数组、列表,您命名!)上创建插入迭代器后,您可以使用赋值语法将项添加到容器中:

std::insert_iterator<std::vector<double>> ins(data, begin(data));
ins = 0;
ins = 1.f;
ins = 2.0;
ins = 'x03';
ins = 4ULL;

或者对于更轻的语法,您可以自己std::inserter()

auto ins = std::inserter(data, begin(data));
ins = /* ... */

这会将要4.00.0插入到矢量data中。在线查看完整程序的示例。


其他工具:

  • http://en.cppreference.com/w/cpp/iterator/back_inserter
  • http://en.cppreference.com/w/cpp/iterator/front_inserter