是否有C ++类似于Java一个CompareTo方法,其中可以在一个数据类型使用> <

2019-09-29 06:31发布

我知道,在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比操作将是有效的。

Answer 1:

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上面,对你可能要下令结果(例如,能够迅速找到所有单词的期望ageale按字母顺序排列)。 如果你不关心排序,您可能需要使用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 ),你可以从它改变mapunordered_map如果你想测试一个哈希表与红黑树。 请注意,这解释“字”很轻率-非空白字符基本上任何序列,因此,例如,它会对待example,作为一个“字”(它会从不同的example )。

请注意,这里使用了infix_iterator我已在别处 。



Answer 2:

有一个在C ++没有标准方法来定义操作员,做了Java什么compareTo()函数的作用。 你可以,但是,实施

int compareTo(const ModifiedString&, const ModifiedString&);

另一种选择是重载<,<=,>,> =,==和!=运营商,例如,通过执行

bool operator<(const ModifiedString&, const ModifiedString&);


Answer 3:

在C ++中,可以定义bool operator<直接,没有必要去创造有趣的名字,同样为operator<operator== 。 他们通常实现为成员函数采取一个额外的参数,在右侧,但你也可以将它们定义为带有两个参数的非成员函数。



Answer 4:

孙决定将不包括经营者在Java中重载,所以他们提供了一个一流的方式(通过成员函数)来完成这项工作:在equals()compareTo()函数。

C ++有运算符重载,它允许你自己的类型中指定的语言运营商的行为。

要了解如何重载运算符,我建议你阅读此线程: 操作符重载



文章来源: Is there a CompareTo method in C++ similar to Java where you can use > < = operations on a data type