使用运算符 << 将 std::strings 推送到向量中

Posted

技术标签:

【中文标题】使用运算符 << 将 std::strings 推送到向量中【英文标题】:use operator << to push std::strings in a vector 【发布时间】:2012-01-14 18:04:06 【问题描述】:

如何使用operator&lt;&lt;strings 推入vector。我搜索了很多,但只找到流示例。

class CStringData


    vector< string > myData;
    // ...
    // inline  operator << ... ???
;

我希望它用作一个简单的省略号(如 void AddData(...) )交换 稳健的参数。

CStringData abc;
abc << "Hello" << "World";

这可能吗?

【问题讨论】:

你为什么想要operator&lt;&lt;strings推入vector @NicolBolas:因为它看起来非常有用,而且很方便。您可以在一行中插入多个字符串! @Nawaz:您也可以通过在每个 object.push_back() 调用之间添加“; ”来做到这一点。用一个单一的表达方式做这件事不会给你带来任何好处。而且它使代码更加迟钝,因为它看起来像流输出。事实并非如此。 @NicolBolas:你的建议需要太多的键盘敲击。另外,如果它看起来像流输出,因为你习惯于看到onlystream &lt;&lt;。没见过&lt;&lt;流输出的人,可能会认为它在做左移操作,其实不然。 '你的建议需要太多的键盘敲击。'听起来像是尖头发会说的,而不是程序员……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&lt;&lt; 定义为:

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++切割字符串

将文本文件读入二维向量。 C++

c++ boost lexical_cast double to string

正则表达式替换为c ++ 11中的回调?

使用运算符 << 将 std::strings 推送到向量中

Opencv:当使用运算符<<保存为原始数据时,将数据从文件读取到矩阵