c++ - CPP:使用已删除功能
问题描述
我正在尝试struct
使用 c++ 中的 lambda 函数对包含自定义条目的向量进行排序。但我收到以下错误消息提示
错误:使用已删除的函数 'dummy_struct& dummy_struct::operator=(const dummy_struct&)
代码如下所示:
#include <regex>
struct dummy_struct
{
dummy_struct(std::string name, int64_t value_a) :
name(name),
value_a(value_a)
{}
const std::string name;
const int64_t value_a;
int ExtractNumberFromName(std::regex key)
{
int retval;
std::cmatch match;
std::regex_search(this->name.c_str(),match,key);
retval=std::stoi(match[0],nullptr);
return retval;
}
};
void SortByCustomKey(const std::vector<dummy_struct> collection, std::regex key)
{
auto compare = [key](dummy_struct a, dummy_struct b)
{
return a.ExtractNumberFromName(key) > b.ExtractNumberFromName(key)
};
std::sort(std::begin(collection),std::end(collection),compare);
}
int main()
{
std::vector<dummy_struct> test;
test.push_back(dummy_struct("Entry[1]",1));
test.push_back(dummy_struct("Entry[2]",2));
test.push_back(dummy_struct("Entry[3]",3));
SortByCustomKey(test,std::regex("[0-9]+"));
}
我在这里想念什么?
解决方案
std::sort 通过交换它的元素来对向量进行排序。
这需要您的类实现复制赋值运算符const
(或移动赋值),由于类中的字段,编译器不会为您生成该运算符。对于您的示例,唯一的解决方案似乎是const
从字段中删除限定符。如果您不希望它们被修改,只需制作它们private
并且不提供(公共)设置器。如果它们绝对必须留在那里,而您只想按排序顺序获取值,则可以使用不同的结构或将指针存储在向量中。
另一种解决方案是为您的类编写一个自定义swap
实现,该实现将const_cast
去掉字段的限定符以用于赋值,尽管这通常是一种不好的代码味道。
推荐阅读
- javascript - 为所有用户刷新一次页面
- r - R在ggplot2的x轴上绘制年龄(以年和月为单位)
- powershell - 命令提示符 powershell 命令以提升批处理文件传递参数
- mongodb - 如何使用 MongoDB PHP 库仅返回匹配的数组项
- mysql - MySQL 将字符串从一个字符替换为另一个字符
- kubernetes - Kubernetes - 将损坏的 pod 的名称和命名空间记录到文件中
- mysql - 如何设计 SQL 表以允许存储和检索当前和历史实体配置记录?
- javascript - 获取相对于 svg 元素的鼠标坐标
- c++ - 如何正确打印堆栈向量?
- java - Jackson @JsonProperty 创建重复名称