重载运算符的范围是什么?它是否会影响作为类成员的集合的插入函数?
what is the scope of the overloaded operator? Does it affect the insert function for a set that is a class member?
我为数据结构定义了一个类,其中我为该类定义了一个重载operator<
。然而,对于_positions
,这是一个std::set<size_t>
,insert()
函数似乎不再做任何事情。
我想知道该类的重载运算符是否意味着它无法看到位置是否在set
中,因此只是不添加它?
我可以添加/删除map
,但不能添加set
。kFlags
是一个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
的使用上保持一致,并且更喜欢小的基元类型的按值,除非你需要引用语义。
相关文章:
- 如何将函数集合传递给客户端类,以便将它们当作客户端类本身的成员使用
- 实现一个在集合上迭代的模板函数
- 尝试使用集合函数时出现分段错误
- 重载运算符的范围是什么?它是否会影响作为类成员的集合的插入函数?
- 基于函数而不是集合的二分搜索或迭代器?
- 成员函数不能为集合迭代器和const_iterator的输入重载(但可以为其他 STL 迭代器重载)
- find() 函数对集合有效吗?
- 我们如何使用下面的集合构造函数构造设置元素
- 有没有一种单行方法来调用集合上的 lambda 函数
- 将all_of与 lambda 函数集合一起使用
- 异质集合调用派生类函数 c++
- 在集合上运行的函数模板,该集合具有默认的"transform"函数,该函数不执行任何操作
- 递归函数,用于使用位掩码 c++ 显示集合的所有子集
- C++集合方法:函数'setCost'不可行:'this'参数的类型'const value_type'
- C++:每当将元素添加到集合中时,如何调用函数
- 使用提升的集合中的成员函数代理
- 在声明'const'函数中循环访问具有'const_iterator'的集合会导致错误
- 避免集合的标头节点需要空构造函数
- 有没有可能拥有C++模板函数,它接受任何类型T的集合
- 具有返回值的变异体(集合函数)