IndiaCharlie
IndiaCharlie

Reputation: 13

Vector elements to a string

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

Upvotes: 0

Views: 346

Answers (2)

Remy Lebeau
Remy Lebeau

Reputation: 595377

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

Upvotes: 1

463035818_is_not_an_ai
463035818_is_not_an_ai

Reputation: 122133

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.

Upvotes: 1

Related Questions