运算符<<矢量重载
operator<< overload for vector
我尝试了在网上找到的以下代码,并且运行良好。
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;
作品,即使2
是int
而不是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.0
0.0
插入到矢量data
中。在线查看完整程序的示例。
其他工具:
- http://en.cppreference.com/w/cpp/iterator/back_inserter
- http://en.cppreference.com/w/cpp/iterator/front_inserter
- C++重载<<具有typedef'd std::vector
- 重载运算符<<:此运算符函数的参数太多
- 在VS 2012上编译,但不使用Netbeans/MinGW-重载<<
- 重载运算符<<用于模板类.即使使用好友关键字也无法获得私人会员
- C++分离成员流重载<<
- 我已经完成了<<运算符重载,但它'It’不起作用
- 重载运算符<<输出地址而不是数据成员
- 重载运算符<<用于ostream语法
- 重载operator< & lt;作为会员打印
- Operator< & lt;重载隐藏其他
- 重载& lt; & lt;为什么我得到以下错误
- 重载ostream&时转换错误无效;operator< & lt;
- operator< & lt;在c++中为类中的类重载
- 重载& lt; & lt;用于打印自定义异常的操作符
- 重载<<运算符错误C2804:二进制'运算符<<'参数太多
- 上Ostream & lt; & lt;重载的困惑
- 重载& lt; & lt;为了我的班级
- 使用带有重载<<endl上的运算符
- 重载& lt; & lt;使用命名空间std
- operator< & lt;重载、名称空间和模板