- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
好的,所以我有 1 个名为 fraction
的用户定义类型,它表示带有分子和分母的普通分数。这是代码:
class Fraction
{
private:
int numerator;
int denominator;
public:
Fraction(int numer,int denom)
:numerator(numer),denominator(denom){}
int get_denom(){return denominator;}
int get_numer(){return numerator;}
};
如您所见,它完全在头文件中实现。
所以我想做的是使用排序算法对分数 vector 进行排序。这是重载“<”运算符的代码(注意:它与 Fraction 类放在同一个文件中,但在类之外):
bool operator<(Fraction& first,Fraction& second)
{
if(first.get_denom() == second.get_denom())
{
return first.get_numer()<second.get_numer()?true:false;
}
int first_num=first.get_denom();
int second_num=second.get_denom();
int lcm=(first_num*second_num)/gcd(first_num,second_num);
int first_new_numerator=(lcm/first_num)*first.get_numer();
int second_new_numerator=(lcm/second_num)*second.get_numer();
return first_new_numerator<second_new_numerator?true:false;
}
它的作用是检查分母是否相等,如果相等则测试分子的值。如果它们不相等,它会使用最小公倍数和 gcd 使它们相等。
真正的问题是当我想在 main 中使用排序算法时(编译时错误)。这是主要代码:
Fraction parse_fraction(string& input)
{
stringstream fraction_string(input);
int numer;
fraction_string>>numer;
char seperator;
fraction_string>>seperator;
int denom;
fraction_string>>denom;
return Fraction(numer,denom);
}
int main()
{
vector<Fraction> fractions;
string input;
while(cin>>input)
{
if(input=="|") break;
fractions.push_back(parse_fraction(input));
}
sort(fractions.begin(),fractions.end);
for(int i=0;i<fractions.size();i++)
{
cout<<fractions[i];
}
return 0;
}
我得到的错误是(注意:我已经正确地重载了分数的“<<”运算符,但不想在这里造成困惑):
/usr/include/c++/4.6/bits/stl_algo.h||In function ‘_RandomAccessIterator std::__unguarded_partition(_RandomAccessIterator, _RandomAccessIterator, const _Tp&) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<Fraction*, std::vector<Fraction> >, _Tp = Fraction]’:|
/usr/include/c++/4.6/bits/stl_algo.h:2253|70|instantiated from ‘_RandomAccessIterator std::__unguarded_partition_pivot(_RandomAccessIterator, _RandomAccessIterator) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<Fraction*, std::vector<Fraction> >]’|
/usr/include/c++/4.6/bits/stl_algo.h:2284|54|instantiated from ‘void std::__introsort_loop(_RandomAccessIterator, _RandomAccessIterator, _Size) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<Fraction*, std::vector<Fraction> >, _Size = long int]’|
/usr/include/c++/4.6/bits/stl_algo.h:5330|4|instantiated from ‘void std::sort(_RAIter, _RAIter) [with _RAIter = __gnu_cxx::__normal_iterator<Fraction*, std::vector<Fraction> >]’|
/home/vanio/Desktop/workspace/C++/Ordner/main.cpp:35|43|instantiated from here|
/usr/include/c++/4.6/bits/stl_algo.h|2212|error: no match for ‘operator<’ in ‘__first.__gnu_cxx::__normal_iterator<_Iterator, _Container>::operator* [with _Iterator = Fraction*, _Container = std::vector<Fraction>, __gnu_cxx::__normal_iterator<_Iterator, _Container>::reference = Fraction&]() < __pivot’|
/usr/include/c++/4.6/bits/stl_algo.h|2212|note: candidates are:|
/usr/include/c++/4.6/bits/stl_pair.h|207|note: template<class _T1, class _T2> bool std::operator<(const std::pair<_T1, _T2>&, const std::pair<_T1, _T2>&)|
/usr/include/c++/4.6/bits/stl_iterator.h|291|note: template<class _Iterator> bool std::operator<(const std::reverse_iterator<_Iterator>&, const std::reverse_iterator<_Iterator>&)|
/usr/include/c++/4.6/bits/stl_iterator.h|341|note: template<class _IteratorL, class _IteratorR> bool std::operator<(const std::reverse_iterator<_IteratorL>&, const std::reverse_iterator<_IteratorR>&)|
/usr/include/c++/4.6/bits/basic_string.h|2510|note: template<class _CharT, class _Traits, class _Alloc> bool std::operator<(const std::basic_string<_CharT, _Traits, _Alloc>&, const std::basic_string<_CharT, _Traits, _Alloc>&)|
/usr/include/c++/4.6/bits/basic_string.h|2522|note: template<class _CharT, class _Traits, class _Alloc> bool std::operator<(const std::basic_string<_CharT, _Traits, _Alloc>&, const _CharT*)|
/usr/include/c++/4.6/bits/basic_string.h|2534|note: template<class _CharT, class _Traits, class _Alloc> bool std::operator<(const _CharT*, const std::basic_string<_CharT, _Traits, _Alloc>&)|
/usr/include/c++/4.6/bits/stl_vector.h|1290|note: template<class _Tp, class _Alloc> bool std::operator<(const std::vector<_Tp, _Alloc>&, const std::vector<_Tp, _Alloc>&)|
/home/vanio/Desktop/workspace/C++/Ordner/Fraction.h|39|note: bool operator<(Fraction&, Fraction&)|
/home/vanio/Desktop/workspace/C++/Ordner/Fraction.h|39|note: no known conversion for argument 2 from ‘const Fraction’ to ‘Fraction&’|
/usr/include/c++/4.6/bits/stl_algo.h|2215|error: no match for ‘operator<’ in ‘__pivot < __last.__gnu_cxx::__normal_iterator<_Iterator, _Container>::operator* [with _Iterator = Fraction*, _Container = std::vector<Fraction>, __gnu_cxx::__normal_iterator<_Iterator, _Container>::reference = Fraction&]()’|
/usr/include/c++/4.6/bits/stl_algo.h|2215|note: candidates are:|
/usr/include/c++/4.6/bits/stl_pair.h|207|note: template<class _T1, class _T2> bool std::operator<(const std::pair<_T1, _T2>&, const std::pair<_T1, _T2>&)|
/usr/include/c++/4.6/bits/stl_iterator.h|291|note: template<class _Iterator> bool std::operator<(const std::reverse_iterator<_Iterator>&, const std::reverse_iterator<_Iterator>&)|
/usr/include/c++/4.6/bits/stl_iterator.h|341|note: template<class _IteratorL, class _IteratorR> bool std::operator<(const std::reverse_iterator<_IteratorL>&, const std::reverse_iterator<_IteratorR>&)|
/usr/include/c++/4.6/bits/basic_string.h|2510|note: template<class _CharT, class _Traits, class _Alloc> bool std::operator<(const std::basic_string<_CharT, _Traits, _Alloc>&, const std::basic_string<_CharT, _Traits, _Alloc>&)|
/usr/include/c++/4.6/bits/basic_string.h|2522|note: template<class _CharT, class _Traits, class _Alloc> bool std::operator<(const std::basic_string<_CharT, _Traits, _Alloc>&, const _CharT*)|
/usr/include/c++/4.6/bits/basic_string.h|2534|note: template<class _CharT, class _Traits, class _Alloc> bool std::operator<(const _CharT*, const std::basic_string<_CharT, _Traits, _Alloc>&)|
/usr/include/c++/4.6/bits/stl_vector.h|1290|note: template<class _Tp, class _Alloc> bool std::operator<(const std::vector<_Tp, _Alloc>&, const std::vector<_Tp, _Alloc>&)|
/home/vanio/Desktop/workspace/C++/Ordner/Fraction.h|39|note: bool operator<(Fraction&, Fraction&)|
/home/vanio/Desktop/workspace/C++/Ordner/Fraction.h|39|note: no known conversion for argument 1 from ‘const Fraction’ to ‘Fraction&’|
||=== Build finished: 22 errors, 0 warnings ===|
最佳答案
bool operator<(Fraction& first,Fraction& second)
问题是你的 operator<
重载了只接受非常量参数,但算法试图将常量引用与 Fraction
进行比较使用容器中的元素。
自 operator<
不修改比较对象的内容,应该通过常量引用来获取它们:
bool operator<(Fraction const & first,Fraction const & second)
关于C++ - 排序算法看不到我为用户定义类型重载的 "<"运算符。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11731455/
假设我有一个类,我在其中重载了运算符 == : Class A { ... public: bool operator== (const A &rhs) const; ... };
我知道你不应该使用 std::find(some_map.begin(), some_map.end()) 或 std::lower_bound,因为它会采用线性时间而不是 some_map.lowe
我正在尝试在 Haskell 中定义 Vector3 数据类型,并允许在其上使用 (+) 运算符。我尝试了以下方法: data Vector3 = Vector3 Double Double Doub
我已经为我的类图将运算符重载为“-”。它的用途并不完全直观(糟糕的编码 - 我知道)但是如果我做 graph3 = graph2-graph1 那么图 3 是应该只接收图 2 和图 1 中的那些顶点。
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: Operator overloading 我想重载 以按字母顺序排列字符串,但我不确定该怎么做。 如何再次
下面的代码给我一个编译错误。谁能告诉我为什么? class mytype { public: int value; mytype(int a) { value = a;
这有什么问题吗? class Vec2 attr_accessor :x, :y # ... def += (v) @x += v.x @y += v.y retu
是否可以重载 [] 运算符两次?允许这样的事情:function[3][3](就像在二维数组中一样)。 如果可能的话,我想看看一些示例代码。 最佳答案 您可以重载 operator[] 以返回一个对象
我的团队目前正在与 Lua 合作,创建一个 android 游戏。我们遇到的一件事是表面上无法创建重载构造函数。 我习惯于使用默认值设置一个对象,然后在需要时使其过载。 前任: apples() {
我有一个网页,在某个时候显示一个导航栏,它只不过是一个 a 元素的列表 (ul)。所述 a 元素的大多数样式规则都是通用的。唯一应该改变的部分是要显示的图像,可以从列表中每个 li 元素的 id 标签
我对使用/重载“范围步长”运算符(.. ..)很感兴趣,但我终其一生都无法了解如何使用它。 在文档中它说 // Usage: start .. step .. finish 但是在 F# shell
Java 11(可能无关紧要): public static String toString(Object obj) { return ReflectionToStringBuilder.to
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
我无法理解以下代码(针对行号进行注释) class Base { void m1(Object o) { } void m2(String o) { } } publi
我有以下代码片段: #include using namespace std; struct Integer{ int x; Integer(const int val) : x(v
class myclass{ //definitions here }; myclass e; int myarray[10]; /* Do something... */ e = myarray;
为什么不能将下标运算符(operator [])作为 friend 函数重载? 最佳答案 正如Bjarne Stroustrup在D&E book中所说: However, even in the o
我有以下代码片段: #include using namespace std; struct Integer{ int x; Integer(const int val) : x(v
因此,我有一个问题是我最近尝试重载 namespace Eng { /** * A structure to represent pixels */ typedef
如何重载onResume()以正确的方式工作?我想从 activity 返回到 MainActivity ,我希望在其中具有与应用程序启动后相同的状态。我想使用 recreate() 但它循环了或者类
我是一名优秀的程序员,十分优秀!