Подтвердить что ты не робот

Предпочтительное преобразование из char (не char *) в std::string

У меня есть char, простой старый символ, который я бы хотел превратить в std::string. std::string(char) не существует, конечно. Я мог бы создать массив char и скопировать его, я мог бы идти через строковые потоки или многие другие небольшие круговые маршруты. В настоящее время я предпочитаю boost::lexical_cast, но даже это кажется слишком многословным для этой простой задачи. Итак, какой предпочтительный способ?

4b9b3361

Ответ 1

std::string имеет конструктор, который принимает число и символ. Символ будет повторяться для заданного количества раз. Таким образом, вы должны использовать:

std::string str(1, ch);

Ответ 2

просто используйте перегрузку, которая принимает char?

то есть. string(1, 'A')

Ответ 3

Вы все еще можете использовать конструктор строк с двумя итераторами:

char c = 'x';
std::string(&c, &c + 1);

Update:

Хороший вопрос Джеймс и GMan. Просто обыскал свободно загружаемый "Новый стандарт C" от ​​Дерека М. Джонса за "указатель мимо", и мой первый удар был:

Если выражение P указывает на элемент объекта массива и выражение Q указывает на последнее элемент одного и того же объекта массива, выражение указателя Q + 1 сравнивается больше, чем P... хотя Q + 1 делает не указывать на элемент массива объект...

В сегментированных архитектурах увеличивая указатель до конца сегмент вызывает обращение адреса сегментированная архитектура вокруг начало этого сегмента (обычно нулевой адрес). Если массив распределенных в таком сегменте, либо реализация должна обеспечить что после массива есть место для там будет один конец адрес, или он использует некоторые другие способ реализации этот случай (например, если используемый сегмент является частью представления указателей, специальный за конечным сегментом значение может быть назначено)...

Модель реляционного оператора C позволяет указатели на объекты, подлежащие обработке в так же, как индексы в массив объекты. Реляционные сравнения между индексами на два разных объекты массива (которые не являются одновременно подобъекты более крупного объекта) редко имеют какой-либо смысл, а стандарт не определять такую ​​поддержку указателей. Некоторым приложениям необходимо использовать информации об относительном расположения различных объектов в место хранения. Однако это использование не было считается достаточным общим полезности для Комитета, чтобы указать модель, определяющая поведение...

Большинство реализаций не выполняют никаких проверок до любой операции над значениями имеющий тип указателя. Большинство процессоров используйте те же инструкции для выполнение реляционных сравнений включая типы указателей, поскольку они используют для арифметических типов. Для процессоров которые используют сегментированную память архитектура, значение указателя часто представленный с использованием двух компонентов, номер сегмента и смещение в пределах этот сегмент. Следствием этого представление состоит в том, что существует много преимущества в распределении хранилища для объекты, которые соответствуют один сегмент (т.е. хранение для объект не охватывает сегмент граница). Одним из преимуществ является оптимизация с использованием сгенерированных машинный код для некоторых реляционные операторы, которые нужны только для проверки компонента смещения сегмента. Это может привести к ситуации, когда p >= q является ложным, но p > q истинно, когда p и q указывают на разные объекты.

Ответ 4

Это работает на gcc С++ 4.9.2 (http://ideone.com/f3qhTe)

#include <iostream>
using namespace std;

int main() {
    // your code goes here
    std::string test;

    test = (char) 76;
    test += (char) 77;
    test += (char) 78;
    test += (char) 79;

    std::cout << "test contains: " << test << std::endl;
    return 0;
}

Ответ 5

Чтобы добавить к ответу, вы можете просто использовать список инициализатора

std::string str = {ch};