【问题标题】:Converting a vector<int> to string [duplicate]将 vector<int> 转换为字符串 [重复]
【发布时间】:2012-01-24 19:02:31
【问题描述】:

在 C++ 中,将整数向量(即vector&lt;int&gt;)转换为字符串的最简单方法是什么?

【问题讨论】:

  • 一串什么?您打算如何将每个整数转换为字符串?它们是代表 ASCII 字符代码,还是您试图构建一个以逗号分隔的数字列表?
  • 你希望输出是什么样的?
  • 假设向量为:[1, 4, 7, 4, 9, 7],字符串为“1,4,7,4,9,7”

标签: c++ string vector


【解决方案1】:

我一般都是这样的……

#include <string>
#include <vector>

int main( int argc, char* argv[] )
{
    std::vector<char> vec;
    //... do something with vec
    std::string str(vec.begin(), vec.end());
    //... do something with str
    return 0;
}

【讨论】:

  • 应该包含哪些头文件?
  • 这有利于显示,但不能用于与任意分隔符连接。
  • 这在转换vector&lt;char&gt; 时也很有意义。如果您对 vector&lt;int&gt; 使用相同的值,则值将转换为 char,我认为这不是意图。
【解决方案2】:

也许std::ostream_iteratorstd::ostringstream

#include <vector>
#include <string>
#include <algorithm>
#include <sstream>
#include <iterator>
#include <iostream>

int main()
{
  std::vector<int> vec;
  vec.push_back(1);
  vec.push_back(4);
  vec.push_back(7);
  vec.push_back(4);
  vec.push_back(9);
  vec.push_back(7);

  std::ostringstream oss;

  if (!vec.empty())
  {
    // Convert all but the last element to avoid a trailing ","
    std::copy(vec.begin(), vec.end()-1,
        std::ostream_iterator<int>(oss, ","));

    // Now add the last element with no delimiter
    oss << vec.back();
  }

  std::cout << oss.str() << std::endl;
}

【讨论】:

  • 值得注意的是,vec.end()-1 只有在知道确定vec 不为空的情况下才是明确定义的。
  • @ildjarn:好点。 vec.back() 也一样。
  • 使用这种方法,是否可以强制某种填充?例如,让所有数字使用 4 个位置,而不管它们有多少位数
  • @CiprianTomoiaga:不是直接的,它出现了。查看这个问题的答案:stackoverflow.com/q/405039/10077
【解决方案3】:

这是使用自定义输出迭代器的替代方法。此示例在空列表的情况下表现正确。此示例演示如何创建自定义输出迭代器,类似于std::ostream_iterator

#include <iterator>
#include <vector>
#include <iostream>
#include <sstream>

struct CommaIterator
:
  public std::iterator<std::output_iterator_tag, void, void, void, void>
{
  std::ostream *os;
  std::string comma;
  bool first;

  CommaIterator(std::ostream& os, const std::string& comma)
  :
    os(&os), comma(comma), first(true)
  {
  }

  CommaIterator& operator++() { return *this; }
  CommaIterator& operator++(int) { return *this; }
  CommaIterator& operator*() { return *this; }
  template <class T>
  CommaIterator& operator=(const T& t) {
    if(first)
      first = false;
    else
      *os << comma;
    *os << t;
    return *this;
  }
};

int main () {
  // The vector to convert
  std::vector<int> v(3,3);

  // Convert vector to string
  std::ostringstream oss;
  std::copy(v.begin(), v.end(), CommaIterator(oss, ","));
  std::string result = oss.str();
  const char *c_result = result.c_str();

  // Display the result;
  std::cout << c_result << "\n";
}

【讨论】:

    【解决方案4】:
    template<typename T>
    string str(T begin, T end)
    {
        stringstream ss;
        bool first = true;
        for (; begin != end; begin++)
        {
            if (!first)
                ss << ", ";
            ss << *begin;
            first = false;
        }
        return ss.str();
    }
    

    这是 str 函数,它可以使整数变成字符串,而不是整数所代表的字符。也适用于双打。

    【讨论】:

    • 我对他的字符串构造函数调用和对名为 str 的函数的调用感到困惑。 Druciferre 不会打印以逗号分隔的数字列表,它会尝试将数字转换为字符。
    • 抱歉,这个问题不够具体,我无法确切知道他想要什么。我没有读过其他的cmets。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-18
    • 2017-05-07
    • 1970-01-01
    • 2013-11-04
    • 2021-12-25
    相关资源
    最近更新 更多