我知道,在java中有一个compareTo方法,你可以在一个类,会比较两个变量并返回一个值-1,或0 signifing大于,小于,并等于操作写。 有没有办法在C ++中做到这一点?
背景:IM创建修改字符串类在它需要一个字符串和一个ArrayList。 我希望能够在字符串比较传统的方式实现,其中,如果在字母表其下这将是小于,高于它会大于。 比我只想链接到文件中的数组列表存储在其中,这个词在一个文本文件索引的网页。 不管怎么说细节并不重要,因为我已经有类写的。 我只需要创建compareTo方法,从而能够在主我的cpp文件或通过例如像各种树木其它数据类型使用。
生病用Java编写的代码,因为我知道如何,也许有人可以帮助我与C ++语法(在C ++为这个项目不幸的是写所需的IM,我是新来的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;
}
然后,当<,>,或==使用上的ModifiedWord比操作将是有效的。
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
)。
请注意,这里使用了infix_iterator
我已在别处 。
有一个在C ++没有标准方法来定义操作员,做了Java什么compareTo()
函数的作用。 你可以,但是,实施
int compareTo(const ModifiedString&, const ModifiedString&);
另一种选择是重载<,<=,>,> =,==和!=运营商,例如,通过执行
bool operator<(const ModifiedString&, const ModifiedString&);
在C ++中,可以定义bool operator<
直接,没有必要去创造有趣的名字,同样为operator<
和operator==
。 他们通常实现为成员函数采取一个额外的参数,在右侧,但你也可以将它们定义为带有两个参数的非成员函数。
孙决定将不包括经营者在Java中重载,所以他们提供了一个一流的方式(通过成员函数)来完成这项工作:在equals()
和compareTo()
函数。
C ++有运算符重载,它允许你自己的类型中指定的语言运营商的行为。
要了解如何重载运算符,我建议你阅读此线程: 操作符重载
文章来源: Is there a CompareTo method in C++ similar to Java where you can use > < = operations on a data type