Home > Mobile >  Vector elements to a string
Vector elements to a string

Time:10-06

I'm trying to turn a vector<int> into a string, with a '[' at the beginning, and a ',' between each element of the vector, and a ']' at the end. But my output is [,,,,] (wanted output [6,4,3,2,1]).

Can you explain to me what i'm doing wrong?

Here's what I tried:

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;    
}

CodePudding user response:

std::string::push_back adds a single char to the string and you tripped over the implicit conversion of int to char. The low values correspond to non-printable characters, thats why you don't see them in the output.

You can use operator = and 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: I didn't even know that std::string::push_back exists. You can also use operator = to add a single character to the string.

CodePudding user response:

You are adding the integers as-is to the string, implicitly converting them to single characters. Most characters with values below 32 are non-printable. You need to convert the integers to strings, such as with std::to_string().

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

Another way to implement this is to use std::ostringstream instead, let operator<< handle the conversion for you, eg:

#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;
}
  • Related