【问题标题】:Vector elements to a string向量元素到字符串
【发布时间】:2021-11-25 18:20:47
【问题描述】:

我正在尝试将vector<int> 转换为字符串,开头为'[',向量的每个元素之间为',',最后为']'。但我的输出是[,,,,](想要的输出[6,4,3,2,1])。

你能解释一下我做错了什么吗?

这是我尝试过的:

int main() {

   std::vector<int> elements = {1,2,3,4,6};   
   std::string outputString = "[";

      
    for(int i = elements.size() - 1; i >= 0; i--) {
        if (i > 0) {

            outputString.push_back(elements.at(i));
            outputString.push_back(',');
        }
        else {
            outputString.push_back(elements.at(i));
        }
    }
    outputString.push_back(']');
    std::cout << std::endl << outputString << std::endl;    
}

【问题讨论】:

  • 您认为outputString.push_back(elements.at(i)); 会做什么?你了解1'1'的区别吗?
  • 更好的方法是创建一个函数,该函数接受开始和结束迭代器以及分隔符,并返回字符串。那么你就不仅仅局限于使用向量了。
  • 我会使用std::ostringstream 来完成这项任务

标签: c++ string vector


【解决方案1】:

您正在将整数原样添加到字符串中,隐式地将它们转换为单个字符。大多数值低于 32 的字符是不可打印的。您需要将整数转换为字符串,例如std::to_string()

outputString += std::to_string(elements[i]); 

另一种实现方式是使用std::ostringstream 代替,让operator&lt;&lt; 为您处理转换,例如:

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

std::string vector_to_string_in_reverse(const std::vector<int> &elements)
{
    std::ostringstream outputStream;
    outputStream << '[';
    if (!elements.empty()) {
        auto it = elements.crbegin(), end = elements.crend();
        outputStream << *it++;
        while (it != end) {
            outputStream << ',' << *it++;
        }
    }
    outputStream << ']';
    return outputStream.str();
}

int main() {
    std::vector<int> elements = {1,2,3,4,6};
    std::cout << std::endl << vector_to_string_in_reverse(elements) << std::endl;
}

【讨论】:

    【解决方案2】:

    std::string::push_back 将单个char 添加到字符串中,而您将int 隐式转换为char 时绊倒了。低值对应于不可打印的字符,这就是您在输出中看不到它们的原因。

    您可以使用operator+=std::to_string

    #include <vector>
    #include <string>
    #include <iostream>
    
    int main() {
    
       std::vector<int> elements = {1,2,3,4,6};   
       std::string outputString = "[";
    
          
        for(int i = elements.size() - 1; i >= 0; i--) {
            if (i > 0) {
    
                outputString += std::to_string(elements.at(i));
                outputString.push_back(',');
            }
            else {
                outputString += std::to_string(elements.at(i));
            }
        }
        outputString.push_back(']');
        std::cout << std::endl << outputString << std::endl;    
    }
    

    PS:我什至不知道std::string::push_back 存在。您还可以使用operator+= 将单个字符添加到字符串中。

    【讨论】:

      猜你喜欢
      • 2018-04-12
      • 1970-01-01
      • 1970-01-01
      • 2016-02-01
      • 1970-01-01
      • 2011-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多