在这里,我们将给大家分享关于为什么没有std::copy_if算法?的知识,让您更了解str没有decode的本质,同时也会涉及到如何更有效地aop为什么没有执行?、c–xutility(2227):
在这里,我们将给大家分享关于为什么没有std :: copy_if算法?的知识,让您更了解str没有decode的本质,同时也会涉及到如何更有效地aop 为什么没有执行?、c – xutility(2227):warning C4996:’std :: _ Copy_impl’、c – 为什么std :: find_if(first,last,p)不通过引用获取谓词?、c – 为什么std :: latch如果有std :: barrier?的内容。
本文目录一览:- 为什么没有std :: copy_if算法?(str没有decode)
- aop 为什么没有执行?
- c – xutility(2227):warning C4996:’std :: _ Copy_impl’
- c – 为什么std :: find_if(first,last,p)不通过引用获取谓词?
- c – 为什么std :: latch如果有std :: barrier?
为什么没有std :: copy_if算法?(str没有decode)
在C 中没有std :: copy_if算法有任何特定的原因吗?我知道我可以使用std ::
remove_copy_if来实现所需的行为。我认为它将用C
0x来实现,但是一个简单的copy_if需要一个范围,一个输出迭代器和一个函子就很好了。是只是简单地错过了它,还是背后有其他原因?
答案1
小编典典根据Stroustrup的“ C ++编程语言”,这只是一个疏忽。
(作为引文,在增强型邮件列表中回答了相同的问题:copy_if)
aop 为什么没有执行?
@JFinal 你好,想跟你请教个问题:
TestService test = Duang.duang(TestService.class, TestInterceptor.class); test.run(); System.out.println("sss");
public class TestService { public void run(){ System.err.println("TestService run"); } }为什么执行结果没有输出
TestService run
c – xutility(2227):warning C4996:’std :: _ Copy_impl’
包括
#pragma warning(push)#pragma warning(disable:4996) #include <boost/archive/iterators/base64_from_binary.hpp>#include <boost/archive/iterators/insert_linebreaks.hpp>#include <boost/archive/iterators/transform_width.hpp>#include <boost/archive/iterators/ostream_iterator.hpp>#pragma warning(pop)
和警告
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\xutility(2227): warning C4996: 'std::_copy_impl': Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. To disable this warning,use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\xutility(2212): Siehe Deklaration von 'std::_copy_impl'1> c:\users\perlig\documents\visual studio 2010\projects\restmanager\restmanager\**http.cpp(257)**: Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template "_OutIt std::copy<boost::archive::iterators::insert_linebreaks<Base,N>,boost::archive::iterators::ostream_iterator<Elem>>(_InIt,_InIt,_OutIt)".1> with1> [1> _OutIt=boost::archive::iterators::ostream_iterator<char>,1> Base=boost::archive::iterators::base64_from_binary<boost::archive::iterators::transform_width<const char *,6,8>>,1> N=76,1> Elem=char,1> _InIt=boost::archive::iterators::insert_linebreaks<boost::archive::iterators::base64_from_binary<boost::archive::iterators::transform_width<const char *,76>1> ]
代码发生在第257行,因为警告消息说.但我无法解决它,因为我不知道是什么错误..
字符串数据包含通过http的基本身份验证的“用户:密码”字符串.
http.cpp(257):
// typdef,prepareusing namespace boost::archive::iterators;stringstream os;typedef insert_linebreaks< // insert line breaks every 72 characters base64_from_binary< // convert binary values ot base64 characters transform_width< // retrieve 6 bit integers from a sequence of 8 bit bytes const char *,8 > >,76 > base64_text; // compose all the above operations in to a new iterator// encrypt#pragma warning(push)#pragma warning(disable:4996)copy( //<<<<<------ LINE 257 base64_text(data.c_str()),base64_text(data.c_str() + data.size()),boost::archive::iterators::ostream_iterator<char>(os));#pragma warning(pop)
有人有什么想法吗?
解决方法
char storage[ 10 ],*p = storage;std::copy( std::istream_iterator<int>(std::cin),std::istream_iterator<int>(),p );
现在如果用户输入10多个int会发生什么?内存将被覆盖,您的内存损坏.
使用boost :: archive :: iterators :: ostream_iterator是完全安全的,但是由于它不遵循MSVC中安全迭代器的设计,所以它将被视为不安全的.
现在你应该禁用-D_SCL_SECURE_NO_WARNINGS的这个警告来cl输入标志,或添加一个pragma来禁用这个警告(就像你这样做),但为什么pragma不工作?
原因很明显,这个编写工作的范围和范围,你使用pragma对它没有任何错误,你必须保护透明度与这个pragma,每件事情都将按预期工作.
c – 为什么std :: find_if(first,last,p)不通过引用获取谓词?
std::find_if
on cppreference.com,的各种签名,我注意到采用谓词函数的风格似乎接受它的值:
template< class InputIt,class UnaryPredicate > InputIt find_if( InputIt first,InputIt last,UnaryPredicate p );
如果我正确理解它们,带有捕获变量的lambdas会为其数据的引用或副本分配存储空间,因此大概是“按值传递”意味着会为调用复制捕获数据的副本.
另一方面,对于函数指针和其他可直接寻址的东西,如果函数指针是直接传递的,性能应该更好,而不是通过引用指针(指向指针).
首先,这是正确的吗?上面的UnaryPredicate是否是一个按值参数?
第二,我对传递lambdas的理解是否正确?
第三,在这种情况下,有没有理由通过价值而不是参照?更重要的是,是不是有一些足够模糊的语法(hello,通用引用)可以让编译器做任何想要获得最大性能的东西?
解决方法
Is the UnaryPredicate above going to be a by-value parameter?
是的,这就是它在函数参数列表中所说的内容.它接受推导的值类型.
除此之外,lambda表达式是prvalues.意思是,使用c++17的保证副本省略,p直接从lambda表达式初始化.在将函数传递给函数时,没有额外的闭包副本或捕获的对象(函数可能会在内部制作更多副本,但这并不常见).
如果谓词是通过引用传递的,则需要实现临时对象.因此对于lambda表达式,交换机无法通过引用获取任何内容.
如果您有其他类型的谓词,这些谓词可以扩展,那么您可以将std :: reference_wrapper传递给该谓词对象,以获得便宜的“句柄”.包装器的operator()
将做正确的事情.
这个定义大多是历史性的,但是现在通过价值传递来实现它并不是一个问题.
为了详细阐述为什么引用语义会很糟糕,让我们试着用它来度过这些年.一个简单的左值引用不会这样做,因为现在我们不支持绑定到右值. const lvalue引用也不会这样做,因为现在我们要求谓词不修改任何内部状态,为什么?
所以到c++11,我们真的没有其他选择.传递值优于参考值.有了新标准,我们可能会修改我们的方法.为了支持rvalues,我们可以添加一个rvalue引用重载.但这是一种冗余练习,因为它不需要做任何不同的事情.
通过传递一个值,调用者可以选择如何创建它,对于prvalues,在c++17中,它几乎是免费的.如果调用者如此期望,他们可以明确地提供引用语义.所以没有任何东西丢失,我认为在简单的使用和API设计方面获得了很多.
c – 为什么std :: latch如果有std :: barrier?
std::barrier
可以使用多次,而
std::latch
只能使用一次.
这听起来像std :: latch只是std :: barrier的一个特例,增加了一个限制而不是一个特性.最重要的是,文档说调用count_down并且n大于内部计数器是未定义的行为,因此必须以编程方式强制执行此限制.
那么为什么我们需要std :: latch?
我唯一的猜测是,可以在硬件级别以不同的方式实现std :: latch,从而提高性能.
是什么原因?
解决方法
工作线程将倒计时,但不要等待,因为它们有其他毛边可以渲染.如果他们进入睡眠状态,他们会使用其他同步原语来完成它.
std :: barrier只允许你在阻塞时倒计时.它不能用于允许10个线程渲染172个毛边.作为屏障上的线程,你唯一可以做的就是到达它,或者决定你不再参与.
可能还存在硬件差异,但它们的API非常不同,并且无法使用障碍替换锁存器使用.
我们今天的关于为什么没有std :: copy_if算法?和str没有decode的分享已经告一段落,感谢您的关注,如果您想了解更多关于aop 为什么没有执行?、c – xutility(2227):warning C4996:’std :: _ Copy_impl’、c – 为什么std :: find_if(first,last,p)不通过引用获取谓词?、c – 为什么std :: latch如果有std :: barrier?的相关信息,请在本站查询。
本文标签: