Ответ 1
y += d;
Я использовал бы оператор +=
вместо названных функций.
Ниже приводится ошибка с ошибкой prog.cpp:5:13: error: invalid conversion from ‘char’ to ‘const char*’
int main()
{
char d = 'd';
std::string y("Hello worl");
y.append(d); // Line 5 - this fails
std::cout << y;
return 0;
}
Я также пробовал следующее, которое компилируется, но ведет себя случайным образом во время выполнения:
int main()
{
char d[1] = { 'd' };
std::string y("Hello worl");
y.append(d);
std::cout << y;
return 0;
}
Извините за этот немой вопрос, но я искал вокруг google, что я мог видеть, это просто "char массив до char ptr", "char ptr до char array" и т.д.
y += d;
Я использовал бы оператор +=
вместо названных функций.
Используйте push_back()
:
std::string y("Hello worl");
y.push_back('d')
std::cout << y;
Чтобы добавить char в std::string var с помощью метода append, вам нужно использовать эту перегрузку:
std::string::append(size_type _Count, char _Ch)
Изменить: Правильно, я неправильно понял параметр size_type, отображаемый в контекстной справке. Это количество добавляемых символов. Поэтому правильный вызов
s.append(1, d);
не
s.append(sizeof(char), d);
Или самый простой способ:
s += d;
В дополнение к другим упомянутым, один из конструкторов строк принимает char и количество повторений для этого char. Таким образом, вы можете использовать это, чтобы добавить один char.
std::string s = "hell";
s += std::string(1, 'o');
Попробуйте использовать оператор + = текст ссылки, append() текст ссылки, или push_back() текст ссылки
Ссылки в этом сообщении также содержат примеры того, как использовать соответствующие API.
Я тестирую несколько предложений, запустив их в большой цикл. Я использовал microsoft visual studio 2015 в качестве компилятора, а мой процессор - i7, 8Hz, 2GHz.
long start = clock();
int a = 0;
//100000000
std::string ret;
for (int i = 0; i < 60000000; i++)
{
ret.append(1, ' ');
//ret += ' ';
//ret.push_back(' ');
//ret.insert(ret.end(), 1, ' ');
//ret.resize(ret.size() + 1, ' ');
}
long stop = clock();
long test = stop - start;
return 0;
В соответствии с этим тестом результаты:
operation time(ms) note
------------------------------------------------------------------------
append 66015
+= 67328 1.02 time slower than 'append'
resize 83867 1.27 time slower than 'append'
push_back & insert 90000 more than 1.36 time slower than 'append'
Заключение
+=
кажется более понятным, но если вы не уверены в скорости, используйте append
проблема с:
std::string y("Hello worl");
y.push_back('d')
std::cout << y;
заключается в том, что вы должны иметь "d", а не использовать имя char, например char d = 'd'; Или я не прав?
int main()
{
char d = 'd';
std::string y("Hello worl");
y += d;
y.push_back(d);
y.append(1, d); //appending the character 1 time
y.insert(y.end(), 1, d); //appending the character 1 time
y.resize(y.size()+1, d); //appending the character 1 time
y += std::string(1, d); //appending the character 1 time
}
Обратите внимание, что во всех этих примерах вы могли бы использовать литерал буква напрямую: y += 'd';
.
Ваш второй пример почти сработал бы по несвязанным причинам. char d[1] = { 'd'};
не работал, но char d[2] = { 'd'};
(обратите внимание, что массив имеет размер два) будет работать примерно так же, как const char* d = "d";
, и может быть добавлен строковый литерал: y.append(d);
.
Попробуйте использовать указатель d в качестве указателя y.append(* г)
str.append(10u,'d'); //appends character d 10 times
Заметьте, что я написал 10u, а не 10 для количества раз, когда я хотел бы добавить символ; замените 10 на любое количество.
Если вы используете push_back, для конструктора строк нет вызова. В противном случае он создаст строковый объект с помощью каста, затем добавит символ в эту строку к другой строке. Слишком много проблем для крошечного персонажа;)