使用运算符 << 将 std::strings 推送到向量中
Posted
技术标签:
【中文标题】使用运算符 << 将 std::strings 推送到向量中【英文标题】:use operator << to push std::strings in a vector 【发布时间】:2012-01-14 18:04:06 【问题描述】:如何使用operator<<
将string
s 推入vector
。我搜索了很多,但只找到流示例。
class CStringData
vector< string > myData;
// ...
// inline operator << ... ???
;
我希望它用作一个简单的省略号(如 void AddData(...)
)交换
稳健的参数。
CStringData abc;
abc << "Hello" << "World";
这可能吗?
【问题讨论】:
你为什么想要让operator<<
将string
s推入vector
?
@NicolBolas:因为它看起来非常有用,而且很方便。您可以在一行中插入多个字符串!
@Nawaz:您也可以通过在每个 object.push_back()
调用之间添加“;
”来做到这一点。用一个单一的表达方式做这件事不会给你带来任何好处。而且它使代码更加迟钝,因为它看起来像流输出。事实并非如此。
@NicolBolas:你的建议需要太多的键盘敲击。另外,如果它看起来像流输出,因为你习惯于看到onlystream <<
。没见过<<
流输出的人,可能会认为它在做左移操作,其实不然。
'你的建议需要太多的键盘敲击。'听起来像是尖头发会说的,而不是程序员……dilbert.com
【参考方案1】:
// C++11
#include <iostream>
#include <string>
#include <vector>
using namespace std;
vector<string>& operator << (vector<string>& op, string s)
op.push_back(move(s));
return op;
int main(int argc, char** argv)
vector<string> v;
v << "one";
v << "two";
v << "three" << "four";
for (string& s : v)
cout << s << "\n";
【讨论】:
【参考方案2】:您可以将operator<<
定义为:
class CStringData
vector< string > myData;
public:
CStringData & operator<<(std::string const &s)
myData.push_back(s);
return *this;
;
现在你可以这样写了:
CStringData abc;
abc << "Hello" << "World"; //both string went to myData!
但我建议您不要将其设为成员函数,而是将其设为 friend
of CStringData
:
class CStringData
vector< string > myData;
public:
friend CStringData & operator<<(CStringData &wrapper, std::string const &s);
;
//definition!
CStringData & operator<<(CStringData &wrapper, std::string const &s)
wrapper.myData.push_back(s);
return wrapper;
用法和以前一样!
要了解您为什么更喜欢交朋友以及规则是什么,请阅读以下内容:
When should I prefer non-member non-friend functions to member functions?【讨论】:
你成就了我的一天!非常感谢。 @howieh:您始终可以将已接受的答案标记为您自己的问题。单击最佳答案左侧的勾号轮廓。【参考方案3】:以下代码附加到流中。同样,您也可以将其添加到向量中。
class CustomAddFeature
std::ostringstream m_strm;
public:
template <class T>
CustomAddFeature &operator<<(const T &v)
m_strm << v;
return *this;
;
因为它是template
,所以你也可以将它用于其他类型。
【讨论】:
【参考方案4】:您需要使用 std::vector.push_back() 或 std::vector.insert() 在向量中插入元素。
【讨论】:
以上是关于使用运算符 << 将 std::strings 推送到向量中的主要内容,如果未能解决你的问题,请参考以下文章
c++ boost lexical_cast double to string