Строка К Более низкому/верхнему в C++

Вы также можете использовать addNA().

x <- c(1, 1, 2, 2, 3, NA)
addNA(x)
# [1] 1    1    2    2    3    <NA>
# Levels: 1 2 3 <NA>

Это в основном удобная функция для факторинга с exclude = NULL. Из help(factor) -

addNA изменяет коэффициент, поворачивая NA на дополнительный уровень (так что значения NA подсчитываются, например, в таблицах).

Итак, еще одна причина, по которой это хорошо, потому что, если у вас уже есть коэффициент f, вы можете использовать addNA(), чтобы быстро добавить NA как факторный уровень без изменения f. Как указано в документации, это удобно для таблиц. Он также хорошо читается.

25
задан Deduplicator 14 April 2014 в 17:47
поделиться

6 ответов

#include <algorithm>
std::string data = "Abc";
std::transform(data.begin(), data.end(), data.begin(), ::toupper);

http://notfaq.wordpress.com/2007/08/04/cc-convert-string-to-upperlower-case/

кроме того, статья CodeProject для общих строковых методов: http://www.codeproject.com/KB/stl/STL_string_util.aspx

31
ответ дан Darren Kopp 28 November 2019 в 18:14
поделиться
> std::string data = “Abc”; 
> std::transform(data.begin(), data.end(), data.begin(), ::toupper);

Это будет работать, но это будет использовать стандарт "C" локаль. Можно использовать фасеты, если необходимо получить tolower для другой локали. Вышеупомянутый код с помощью фасетов был бы:

locale loc("");
const ctype<char>& ct = use_facet<ctype<char> >(loc);
transform(str.begin(), str.end(), std::bind1st(std::mem_fun(&ctype<char>::tolower), &ct));
20
ответ дан GManNickG 28 November 2019 в 18:14
поделиться

Необходимо также рассмотреть этот вопрос . В основном проблема состоит в том, что стандартные библиотеки C/C++ не были созданы для обработки данных Unicode, таким образом, необходимо будет обратиться к другим библиотекам.

Это может измениться, поскольку стандарт C++ обновляется. Я знаю, что следующий компилятор от Borland (CodeGear) будет иметь поддержку Unicode, и я предположил бы, что компилятор C++ Microsoft будет иметь, или уже имеет строковые библиотеки тот Unicode поддержки.

4
ответ дан Community 28 November 2019 в 18:14
поделиться

Как Darren сказал Вам, самый легкий метод должен использовать станд.:: преобразовать.

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

2
ответ дан Steve Gury 28 November 2019 в 18:14
поделиться

То, что говорит Steve, правильно, но я предполагаю, что, если Ваш код должен был поддерживать несколько языков, у Вас мог бы быть метод фабрики, который инкапсулирует ряд методов, которые делают соответствующий toUpper или toLower на основе того языка.

0
ответ дан axs6791 28 November 2019 в 18:14
поделиться

Для копипастеров, надеющихся использовать ответ Ника Стронга, обратите внимание на орфографическую ошибку в "use_factet" и отсутствие третьего параметра в std :: transform:

locale loc("");
const ctype<char>& ct = use_factet<ctype<char> >(loc);
transform(str.begin(), str.end(), std::bind1st(std::mem_fun(&ctype<char>::tolower), &ct));

должно быть

locale loc("");
const ctype<char>& ct = use_facet<ctype<char> >(loc);
transform(str.begin(), str.end(), str.begin(), std::bind1st(std::mem_fun(&ctype<char>::tolower), &ct));
6
ответ дан 28 November 2019 в 18:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: