我已经创建了一组算法,它接受字符串向量的输入,检查是否有字符串出现超过一次:如果是,则从向量中删除所有额外出现的字符串,然后输出新的,'更轻'的数组,没有冗余。
它工作得很好,除了现在我要使它不区分大小写;我试图简单地将toupper()
std函数添加到==
比较语句中,但是它似乎不起作用。
我对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;
}
现在,我们不能留下洞,所以我们应该使用erase(如@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;
@Dave,谢谢你,我会试试的;它看起来又干净又短。然而,我发现了使用变换和复制旧向量的更脏的解决方案。
// 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;
如果你想处理c++字符串像Java字符串一样容易,那么Boost字符串算法库就是你要走的路。对于一个c++新手程序员来说,安装Boost可能有点困难(尽管与许多其他c++库相比,它是一件轻而易举的事情),但它是值得的。
你的问题基本上可以归结为:
boost::algorithm::to_upper_copy(list[i]) == boost::algorithm::to_upper_copy(list[j])
我只是做了一个快速谷歌toupper,我没有找到它的任何字符串版本。我见过的唯一标准的touppper()是int toupper(int c);
-这意味着你只能用它来比较单个字符!你试过stricmp()吗?
if ( 0 == _stricmp(list[i], list[j]) ) {
list[j] = "";
count--;
}
根据你的编译器,你可能有也可能没有这个函数。
首先,
list[j] = ""; // should never work.
可以使用erase删除一个字符。
list.erase(j, 1);
或者,为了完全避免这种情况,您可以使用临时的"builder"字符串,并在需要时向其推送字符。