我知道在java中有一个compareTo方法,您可以在一个类中编写该方法,该方法将比较两个变量并返回值-1,1或0,表示大于,小于和等于运算。有没有办法在C++做到这一点?
背景:我正在创建一个修改后的字符串类,其中它需要一个字符串和一个数组列表。我希望能够以传统方式比较字符串,如果它在字母表中较低,它将小于,高于它将大于。而不是我只想将数组列表链接到文件以存储在文本文件中索引单词的页面。无论如何,细节并不重要,因为我已经写好了课程。我只需要创建 compareTo 方法,该方法可以在我的 cpp 文件的主文件或其他数据类型(例如各种树)中使用。
我知道如何用 java 编写代码,也许有人可以帮助我C++语法(不幸的是,我需要为这个项目编写 c++ 代码,而且我是C++新手)
我将缩短代码以粗略概述 im 所做的事情,而不是编写 compareTo 方法,因为我知道如何在 java 中
class name ModifiedString
Has variables: word , arraylist pagelist
Methods:
getWord (returns the word associated with the class, i.e its string)
appendPageList (adds page numbers to the array list, this doesnt matter in this question)
她的我会如何在java中做到这一点
int compareTo(ModifiedString a){
if(this.getWord() > a.getWord())
return 1;
else if (this.word() < a.getWord())
return -1;
else return 0;
}
然后,当在修改字上使用<、>或==时,这些操作将是有效的。
std::string
已经包含operator<
的工作重载,因此您可以直接比较字符串。Java 之所以使用compareTo
,主要是因为内置的比较运算符生成的结果通常对字符串没有用。作为一种较低级别的语言,Java不支持用户定义的运算符重载,因此它使用compareTo
作为创可贴来弥补语言的不足。
但是,从您的描述来看,您根本不需要直接处理任何内容。至少正如你所描述的问题,你真正想要的是这样的:
std::map<std::string, std::vector<int> > page_map;
然后,您将从文本文件中读取单词,并将每个单词出现的页码插入到页面映射中:
page_map[current_word].push_back(current_page);
请注意,我使用了上面的std::map
,期望您可能想要有序的结果(例如,能够按字母顺序快速找到从age
到ale
的所有单词)。如果您不关心排序,则可能需要改用std::unordered_map
。
编辑:这是一个简单的文本交叉引用程序,它读取文本文件(从标准输入)并按行号(即每个"单词"以及该单词出现的行号)写出交叉引用。
#include <map>
#include <unordered_map>
#include <iostream>
#include <string>
#include <vector>
#include <sstream>
#include <iterator>
#include "infix_iterator.h"
typedef std::map<std::string, std::vector<unsigned> > index;
namespace std {
ostream &operator<<(ostream &os, index::value_type const &i) {
os << i.first << ":t";
std::copy(i.second.begin(), i.second.end(),
infix_ostream_iterator<unsigned>(os, ", "));
return os;
}
}
void add_words(std::string const &line, size_t num, index &i) {
std::istringstream is(line);
std::string temp;
while (is >> temp)
i[temp].push_back(num);
}
int main() {
index i;
std::string line;
size_t line_number = 0;
while (std::getline(std::cin, line))
add_words(line, ++line_number, i);
std::copy(i.begin(), i.end(),
std::ostream_iterator<index::value_type>(std::cout, "n"));
return 0;
}
如果您查看(index
)的第一个typedef
,如果要测试哈希表与红黑树,则可以将其从map
更改为unordered_map
。请注意,这非常松散地解释"单词"——基本上是任何非空格字符序列,因此,例如,它会example,
视为"单词"(它将与example
分开)。
请注意,这使用了我在其他地方发布的infix_iterator
。
C++中没有标准方法来定义执行 Java compareTo()
函数所做的事情的运算符。但是,您可以实现
int compareTo(const ModifiedString&, const ModifiedString&);
另一种选择是重载 <、<=、>、>=、== 和 != 运算符,例如通过实现
bool operator<(const ModifiedString&, const ModifiedString&);
在C++中,您可以直接定义bool operator<
,无需发明有趣的名称,operator<
和operator==
也是如此。它们通常实现为接受一个额外参数的成员函数,即右侧,但您也可以将它们定义为接受两个参数的非成员函数。
Sun决定不在Java中包含运算符重载,因此他们提供了一种类内方式(通过成员函数)来完成这项工作:equals()
和compareTo()
函数。
C++具有运算符重载,它允许您在自己的类型中指定语言运算符的行为。
要学习如何重载运算符,我建议您阅读此线程:运算符重载