重载运算符的范围是什么?它是否会影响作为类成员的集合的插入函数?

what is the scope of the overloaded operator? Does it affect the insert function for a set that is a class member?

本文关键字:集合 函数 插入 影响 成员 是否 范围 运算符 范围是 是什么 重载      更新时间:2023-10-16

我为数据结构定义了一个类,其中我为该类定义了一个重载operator<。然而,对于_positions,这是一个std::set<size_t>insert()函数似乎不再做任何事情。

我想知道该类的重载运算符是否意味着它无法看到位置是否在set中,因此只是不添加它?

我可以添加/删除map,但不能添加setkFlags是一个map,所有这些测试都通过了。

#include <set>
#include <iostream>
#include <map>
#include <math.h>
#include "kmerClass.h"
namespace ft {
KmerClass::KmerClass(std::string kmer)
: _kmer(kmer),
_kFlags(),
_positions(),
_readIDs()
{
}
std::set<size_t> KmerClass::getKPositions() const {return this->_positions;}
void KmerClass::setKPositions( std::set<size_t> kPositions, uint offset)
{
for (auto kPosition : kPositions){addKPosition(kPosition, offset);}
}
void KmerClass::addKPosition(const size_t& kPosition, const uint& offset)
{
size_t kPos = kPosition + offset;
std::set<size_t> positions = this->_positions;
positions.insert(kPos);
}
void KmerClass::removeKPosition(size_t kPosition, uint offset)
{
size_t kPos = kPosition + offset;
std::set<size_t> positions = this->_positions;
positions.erase(kPos);
}
bool KmerClass::hasKPosition(size_t kPosition) const{
std::set<size_t> kPositions = this->_positions;
const bool is_in = kPositions.find(kPosition) != kPositions.end();
return is_in;
}
bool KmerClass::operator< (const ft::KmerClass &k) const {return _kmer < k._kmer;}
KmerClass::~KmerClass()
{
}
}

头文件是:

#ifndef KMERCLASS_H
#define KMERCLASS_H
#include <set>
#include <iostream>
#include <map>
#include "ftPropsClass.h"
namespace ft {
class KmerClass
{
public:
KmerClass(std::string kmer);
virtual ~KmerClass();
std::string _kmer;
std::map<ft::FlagType, bool> _kFlags;
std::set<size_t> _positions;
std::set<int> _readIDs;
std::set<size_t> getKPositions()const;
void setKPositions(std::set<size_t> kPositions, uint offset = 0);
void addKPosition(const size_t& kPosition, const uint& offset = 0);

void removeKPosition(size_t kPosition, uint offset = 0);
bool hasKPosition(size_t position) const;
bool operator< (const ft::KmerClass &k) const;
};
}
#endif // KMERCLASS_H

我尝试运行的测试是

//======================================================================
TEST_F(TestKmerClass, KPosition)
{
TEST_DESCRIPTION("Add single position to kmer class");
ft::KmerClass* testKmerClass = new ft::KmerClass("AAAA");
testKmerClass->setKPositions({1000, 2340});
EXPECT_TRUE(testKmerClass->hasKPosition(1000));
EXPECT_FALSE(testKmerClass->hasKPosition(666));
testKmerClass->addKPosition(666);
EXPECT_TRUE(testKmerClass->hasKPosition(666));
EXPECT_FALSE(testKmerClass->hasKPosition(924357));
testKmerClass->removeKPosition(2340);
EXPECT_FALSE(testKmerClass->hasKPosition(2340));
EXPECT_TRUE(testKmerClass->hasKPosition(1000));
EXPECT_TRUE(testKmerClass->hasKPosition(666));
}

这与运算符重载或insert无关。

您插入了错误的集合。

下面的每个函数都复制成员变量,然后在丢弃副本之前对副本进行操作。

void KmerClass::addKPosition(const size_t& kPosition, const uint& offset)
{
size_t kPos = kPosition + offset;
std::set<size_t> positions = this->_positions;
positions.insert(kPos);
}
void KmerClass::removeKPosition(size_t kPosition, uint offset)
{
size_t kPos = kPosition + offset;
std::set<size_t> positions = this->_positions;
positions.erase(kPos);
}
bool KmerClass::hasKPosition(size_t kPosition) const{
std::set<size_t> kPositions = this->_positions;
const bool is_in = kPositions.find(kPosition) != kPositions.end();
return is_in;
}

添加&以进行positions/kPositions引用,或者理想情况下,直接使用_positions。没有必要有这种复杂性。

void KmerClass::addKPosition(const size_t kPosition, const uint offset)
{
_positions.insert(kPosition + offset);
}
void KmerClass::removeKPosition(const size_t kPosition, const uint offset)
{
_positions.erase(kPosition + offset);
}
bool KmerClass::hasKPosition(const size_t kPosition) const
{
return _positions.find(kPosition) != _positions.end();
}

(我还修复了你的函数参数中的一些怪异之处;在const的使用上保持一致,并且更喜欢小的基元类型的按值,除非你需要引用语义。