运营商LT;<向量

时间:2018-03-20 10:02:15

标签: c++ vector overloading

我尝试了以下在网上找到的代码,并且完美无缺。

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

我有以下错误: 错误:不匹配'operator&lt;&lt;' (操作数类型是'std :: vector&gt;'和'std :: string {aka std :: basic_string}')

我的第二个问题是代码的第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(String)类型,t1是String类型 这就是为什么我想知道为什么从模板中删除typename T2导致错误,即使value_type是两个字符串

2 个答案:

答案 0 :(得分:1)

  

我尝试了以下在网上找到的代码,并且完美无缺。

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

我不会说这完美无缺:

  • 函数参数t1被值接受,这意味着调用者值的 copy 。这有时非常低效。 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 << '.'会为当前存储的每个字符串附加一个句点,其他人可能希望它创建一个由'。'连接的现有元素的字符串 - 所有这些希望/期望与你提议的一样合理,所以任何阅读客户代码的人都必须心胸开阔才能实现操作目前还不清楚,然后深入了解你的<<函数实际上在做什么。

  

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

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

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

  

我有以下错误:错误:'运营商&lt;&lt;'不匹配(操作数类型是'std :: vector&gt;'和'std :: string {aka std :: basic_string}')

您的错误消息是乱码而您尚未(但)发布了您的源代码,因此我无法说出您在那里做错了什么....

答案 1 :(得分:1)

即使你没有明确要求,我的水晶球告诉我你对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 = /* ... */

这会将0.0 4.0插入到向量data中。请参阅a complete program online的例子。

其他工具: