关于仿函数能够保存状态的问题
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值就应该改变啊……
因为改变的不是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。逻辑错误。行为是预期的。以上是关于关于仿函数能够保存状态的问题的主要内容,如果未能解决你的问题,请参考以下文章