在C ++中是否有类似于Java的CompareTo方法,您可以使用> < =对数据类型的操作

时间:2013-11-15 16:08:06

标签: c++ class compare string-comparison

我知道在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,而不是操作有效。

4 个答案:

答案 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,期望您可能需要有序的结果(例如,能够按字母顺序快速查找从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;
}

如果要查看第一个typedefindex),如果要测试哈希表与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