我知道在java中有一个compareTo方法,你可以在一个类中编写,它将比较两个变量并返回值-1,1或0,表示大于,小于和等于操作。有没有办法在C ++中执行此操作?
背景: 我创建一个修改过的字符串类,其中需要一个字符串和一个arraylist。我希望能够以传统的方式比较字符串,如果字母表中的字符串低于它,那么它将大于它。我只想将数组列表链接到文件,以存储在文本文件中索引单词的页面。无论如何,具体细节并不重要,因为我已经写了这个课程。我只需要创建compareTo方法,该方法可以在我的cpp文件的主要部分中使用,或者通过其他数据类型(例如各种树)来创建。
我会在java中编写代码,因为我知道如何使用C ++语法可能会帮助我(我需要用c ++编写这个项目,我不熟悉C ++)我将缩短代码以粗略概述我正在做什么比编写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;
}
然后当&lt; ,&gt; ,或==用于ModifiedWord,而不是操作有效。
答案 0 :(得分:2)
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;
}
如果要查看第一个typedef
(index
),如果要测试哈希表与map
,则可以将其从unordered_map
更改为example,
红黑树。请注意,这非常松散地解释“单词” - 基本上是任何非空白字符序列,因此,例如,它会将example
视为“单词”(并且它将与{{1}分开})。
请注意,这会使用infix_iterator
我发布的elsewhere。
答案 1 :(得分:0)
在C ++中没有标准的方法来定义执行Java compareTo()
函数的操作符。但是,您可以实施
int compareTo(const ModifiedString&, const ModifiedString&);
另一种选择是重载&lt ;,&lt; =,&gt;,&gt; =,==和!=运算符,例如通过实施
bool operator<(const ModifiedString&, const ModifiedString&);
答案 2 :(得分:0)
在C ++中,您可以直接定义bool operator<
,无需为operator<
和operator==
创建有趣的名称。它们通常作为成员函数实现,在右侧有一个额外的参数,但你也可以将它们定义为带有两个参数的非成员函数。
答案 3 :(得分:0)
Sun决定不在Java中包含运算符重载,因此他们提供了一种类内的方式(通过成员函数)来完成这项工作:equals()
和compareTo()
函数。
C ++具有运算符重载功能,允许您在自己的类型中指定语言运算符的行为。
要了解如何重载运算符,建议您阅读此主题:Operator overloading