【发布时间】:2026-01-22 10:05:02
【问题描述】:
我正在尝试使用 c++ 中的 lambda 函数对包含自定义 struct 条目的向量进行排序。但是我收到以下错误消息提示
错误:使用已删除的函数‘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]+"));
}
我在这里错过了什么?
【问题讨论】:
-
你所有的字段都是
const那么分配怎么能做呢?一个const字段足以防止编译器生成赋值运算符的默认实现。 -
您应该通过引用传递重要的参数,目前您的排序适用于
test向量的副本。 -
@MarekR 我使用了
const表示法,因为这些字段一旦初始化就不应更改。这是否意味着通过调用sort我正在由于值被更改而产生问题? -
见doc of std::sort:
The type of dereferenced RandomIt must meet the requirements of MoveAssignable and MoveConstructible. -
@Broxigar 正确。
const成员变量很痛苦 :-) 只需将它们设为private并且不要更改它们 - 除非正在完成复制或移动分配。
标签: c++