关于仿函数能够保存状态的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于仿函数能够保存状态的问题相关的知识,希望对你有一定的参考价值。

class GT_cls

public:
GT_cls(size_t val=0):bound(val),count(0)
bool operator()(const string &s)

++count;
if(s.size()>bound)

return true;

return false;

int getCount()

return count;

void setCount(int c)

count = c;

private:
string::size_type bound;
int count;
;

void main()

vector<string> coll;
coll.push_back("skdfjl");
coll.push_back("wsdkfjsldfd");
coll.push_back("hello world");
coll.push_back("wang");
coll.push_back("chuan");

GT_cls tmp(9);

cout<<"larger than 10--------->"<<count_if(coll.begin(),coll.end(),tmp)<<endl;
cout<<"less than 100---------->"<<coll.size()<<endl;
cout<<tmp.getCount()<<endl<<endl;

不是说仿函数能够保存状态吗,怎么这里的count的值没有改变,而如果我显示调用,就改变了,比如:
tmp("wnagkdfjlsdfjsldkf");
cout<<tmp.getCount()<<endl;
这时的count值就变了,为什么呢?请高手指点
count_if源码如下:
count_if(InputIterator first,InputIterator last,Predicate pred)

...
for(;first!=last;++first)

if(pred(*first))
++n;

return n;

另外就是,我问的是经历过count_if以后,为什么tmp里的 count值不变?

补充:count_if本身有个计数值n,这个我知道,第三个参数实际是仿函数调用,即使用了类里重载的()操作符,而在重载函数里,我人为地改变了count值,同一个对象只要使用了()操作符,count值就应该改变啊……

参考技术A 这个大概要取决于 count_if的参数是怎么写的了。 如果第三个参数是按值传递的,那么累加的结果可能被记载在 count_if的实参里, 但是不会影响tmp这个变量里记录的东西

因为改变的不是tmp里的count值。 count_if的参数是按值传递的,改变的是count_if里实参的count的值
参考技术B 调用这个函数才会改变count的值bool operator()(const string &s)
这个函数是重载运算符()的函数
tmp("wnagkdfjlsdfjsldkf");就调用了这个函数
但是tmp(9)调用的是构造函数,count值被设置成0

补充:count_if里第3个参数是Predicate类型的,但是tmp是GT_cls类型的,作为参数编译的时候不会报错么?

保存函数的状态

【中文标题】保存函数的状态【英文标题】:Saving the state of the function 【发布时间】:2021-12-26 21:11:10 【问题描述】:

我有两个输入文本字段,我想使用状态自动更新它们。但是每当我取消选中该框时,该值就会消失。输入后,如果我也取消选中它,它应该在那里。如果不是,我无法在输入文本字段中写入两个不同的值。

import "./styles.css";
import  Jsme  from "jsme-react";
import  useState  from "react";
import  useForm  from "react-hook-form";
import  default as FormData  from "form-data";

export default function App() 
  // I added the following state variables to keep track of checkboxes
  const [isCheckbox1Checked, setIsCheckbox1Checked] = useState(false);
  const [isCheckbox2Checked, setIsCheckbox2Checked] = useState(false);
  const [input1, setInput1] = useState("");
  const [input2, setInput2] = useState("");
  const [syncToFirst, setSyncToFirst] = useState();
  const [solutestate, setSoluteState] = useState();
  const  register, handleSubmit, control  = useForm(
    defaultValues: 
      solute: "",
      solvent: ""
    
  );
  return (
    <div className="App">
      <Jsme
        
        
        options="oldlook,star"
        onChange=setSoluteState
      />
      <h1>solutestate</h1>
      <input
        className="mr-2 leading-tight"
        type="checkbox"
        value=isCheckbox1Checked
        onChange=() => setIsCheckbox1Checked(prev => !prev)
      />
      <input
        className="mr-2 leading-tight"
        type="checkbox"
        value=isCheckbox2Checked
        onChange=() => setIsCheckbox2Checked(prev => !prev)
      />
      <form>
        <input
          ...register("solute")
          placeholder="SOLUTE"
          onChange=(e) =>
            syncToFirst === 1
              ? setSoluteState(e.target.value)
              : setInput1(e.target.value)
          
          value=isCheckbox1Checked ? solutestate : input1
        />
        <input
          ...register("solvent")
          placeholder="SOLVENT"
          onChange=(e) =>
            syncToFirst === 2
              ? setSoluteState(e.target.value)
              : input2(e.target.value)
          
          value=isCheckbox2Checked ? solutestate : input2
        />
      </form>
    </div>
  );

需要一个处理程序来在文本更改时保存状态。因此,如果我取消选中复选框,则输入字段文本中会显示先前的状态。每当我尝试直接在第二个输入文本字段中输入时,它都会抛出错误input2 is not a function。代码沙盒link

【问题讨论】:

我没有看到这个语句的函数 input2:input2(e.target.value) 也许你的意思是setInput2(e.target.value) syncToFirst 的第一个值是 undefined。如果未定义,您是否试运行过会发生什么? @harsh 是的,这是 input2 的错字。但是,您其余的问题对您要实现的目标几乎没有意义。请改写更好,以便人们可以回答 What is expected 并包括 What you have tried already 【参考方案1】:

首先input2(e.target.value) 不是一个函数。也许你的意思是setInput2(e.target.value)

其次,您将syncToFirst 的值设置为undefined。所以声明

 syncToFirst === 1
      ? setSoluteState(e.target.value)
      : setInput1(e.target.value)

进入else: 部分,将其值再次设置为"",因为e.target.value""。希望能回答你的问题。

Edit:

进一步解释当第一个复选框被选中时,syncToFirst 的值为 1。现在,当您在第一个复选框中键入内容时,您调用此方法 setSoluteState 但 input1 的值作为单一事实来源是 ””。因此,当您取消选中此字段时,syncToFirst 变为 2。现在值变为 input1,正如您给出的那样。但是 input1 是 "" 所以它变成了空的。然而,另一个文本字段占用了溶质状态的值并且它上升了。现在,当您输入第一个 input1 字段时,它会更改其值。

这是预期的行为,没有任何问题。你应该按照你的逻辑工作或私信我。请记住,在 react 中,JSX 部分被重新渲染并计算 value 字段。把它写下来,你会看到 input1 和 input2 的实际值何时发生变化,以及你在每次重新渲染中分配的内容。

【讨论】:

感谢您指出拼写错误。我不明白这里的undefined 部分。 codesandbox.io/s/little-darkness-c1yfq?file=/src/App.js 你可以在这里查看我在做什么。在未选中时文本字段从编辑器获取其值后,该值正在消失。我正在使用两个文本字段进行预测@Shobhit Tewari 我已经在我的回答中作为编辑给出了解释。之后给我 DM。逻辑错误。行为是预期的。

以上是关于关于仿函数能够保存状态的问题的主要内容,如果未能解决你的问题,请参考以下文章

stl源码剖析 为啥要使用仿函数

在“松散的monoidal仿函数”中,“松散”是什么意思?

STL 仿函数(函数对象)

函数对象(仿函数)

仿函数和函数指针

C++_26_仿函数C++_26_仿函数