Я создал набор алгоритмов, который принимает входные данные для строкового вектора, проверяет, встречается ли какая-либо из строк более одного раза: если это так, удаляет все дополнительные вхождения строки из вектора, а затем выводит новый, более «легкий» массив без увольнения.
Это прекрасно работает, за исключением того, что теперь я должен сделать это без учета регистра; Я пытаюсь просто добавить toupper()
стандартная функция к ==
утверждение сравнения, однако, это, кажется, не работает.
У меня есть более знакомый опыт работы с Java, и я пытаюсь изучить C ++.
Может кто-нибудь показать мне, как исправить мой синтаксис?
// Output old list.
cout << endl << "==========\nOld list:\n==========";
for (int i = 0; i < count; i++) {
cout << endl << list[i];
}
cout << endl << endl;
// Check uniqueness.
for (int i = 0; i < count; i++)
for (int j = i+1; j < count; j++) {
if (toupper(list[i]) == toupper(list[j])) {
list[j] = "";
count--;
}
}
// Output new list.
cout << endl << "==========\nNew list:\n==========";
for (int i = 0; i < count; i++) {
cout << endl << list[i];
}
cout << endl << endl;
Ваша петля уходит «дыра» в list
массив вектор, но размер массив вектор не меняется (но вы уменьшаете верхнюю границу count
)
Вероятно, есть много других альтернатив, но если вы не хотите сильно его изменять, возможно, вам нужно добавить дополнительный цикл для копирования непустой элементы из list
массив в новый массив
Сначала у нас будет функция для выполнения toUpper (она изменена с @ Jim22150)
std::string stringToUpper(const std::string &input) {
std::string toBeModified=input;
std::transform(toBeModified.begin(), toBeModified.end(), toBeModified.begin(), ::toupper);
return toBeModified;
}
Теперь мы не должны оставлять дыры, поэтому мы должны использовать стирание (как указал @Scott Christopher Stauffe):
// Output old list.
cout << endl << "==========\nOld list:\n==========";
for (int i = 0; i < count; i++) {
cout << endl << list[i];
}
cout << endl << endl;
// Check uniqueness.
for (int i = 0; i < count; i++)
for (int j = i + 1; j < count; j++) {
if(stringToUpper(list[i]) == stringToUpper(list[j])) {
list.erase(j,1);
count--;
}
}
}
// Output new list.
cout << endl << "==========\nNew list:\n==========";
for (int i = 0; i < count; i++) {
cout << endl << newlist[i];
}
cout << endl << endl;
@DaveS, спасибо, Дэйв, я попробую это; выглядит чисто и коротко. Тем не менее, я нашел более грязное решение с помощью преобразования и создания дубликата старого вектора.
// Output old list.
cout << endl << "==========\nOld list:\n==========";
for (int i = 0; i < count; i++) {
cout << endl << list[i];
}
cout << endl << endl;
// Check uniqueness.
for (int i = 0; i < count; i++)
for (int j = i + 1; j < count; j++) {
std::transform(list[i].begin(), list[i].end(), list[i].begin(), ::toupper);
std::transform(list[j].begin(), list[j].end(), list[j].begin(), ::toupper);
if (list[i] == list[j]) {
newlist[j] = "";
count--;
}
}
// Output new list.
cout << endl << "==========\nNew list:\n==========";
for (int i = 0; i < count; i++) {
cout << endl << newlist[i];
}
cout << endl << endl;
Я только что сделал быстрый гугл о таппере и не нашел ни одной строковой версии. Единственный стандартный touppper (), который я видел, это int toupper(int c);
— это означает, что вы можете использовать его только для сравнения отдельных символов! Ты пытался stricmp ()?
if ( 0 == _stricmp(list[i], list[j]) ) {
list[j] = "";
count--;
}
В зависимости от вашего компилятора вы можете иметь или не иметь эту функцию в вашем распоряжении.
Прежде всего,
list[j] = ""; // should never work.
Вы можете удалить символ с помощью стирания.
list.erase(j, 1);
В качестве альтернативы, чтобы избежать всего этого, вы можете использовать временную строку «builder» и просто использовать push_back-символы, когда это необходимо.
Если вы хотите обрабатывать строки C ++ так же легко, как строки Java, тогда Библиотека Boost String Algorithms это путь. Установка Boost может быть довольно сложной для начинающего программиста на C ++ (хотя это проще простого по сравнению со многими другими библиотеками C ++), но это окупается.
Ваша проблема будет по существу сведена к этому:
boost::algorithm::to_upper_copy(list[i]) == boost::algorithm::to_upper_copy(list[j])