GVKun编程网logo

为什么没有std :: copy_if算法?(str没有decode)

5

在这里,我们将给大家分享关于为什么没有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)

为什么没有std :: copy_if算法?(str没有decode)

在C 中没有std :: copy_if算法有任何特定的原因吗?我知道我可以使用std ::
remove_copy_if来实现所需的行为。我认为它将用C

0x来实现,但是一个简单的copy_if需要一个范围,一个输出迭代器和一个函子就很好了。是只是简单地错过了它,还是背后有其他原因?

答案1

小编典典

根据Stroustrup的“ C ++编程语言”,这只是一个疏忽。

(作为引文,在增强型邮件列表中回答了相同的问题:copy_if)

aop 为什么没有执行?

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’

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)

有人有什么想法吗?

解决方法

我想你知道警告的意思是什么,但首先我会描述警告,然后说出如何去做. Microsoft在其CRT,STL,MFC …中实现了新的安全启用功能集,并将旧版本的这些功能标记为不推荐使用,为您提供一个提示,您应该迁移到新的安全版本.所以说std :: copy是不安全的!怎么样?如下:
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)不通过引用获取谓词?

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?

c – 为什么std :: latch如果有std :: barrier?

从文档中可以清楚地看出,它们之间的区别在于 std::barrier可以使用多次,而 std::latch只能使用一次.

这听起来像std :: latch只是std :: barrier的一个特例,增加了一个限制而不是一个特性.最重要的是,文档说调用count_down并且n大于内部计数器是未定义的行为,因此必须以编程方式强制执行此限制.

那么为什么我们需要std :: latch?

我唯一的猜测是,可以在硬件级别以不同的方式实现std :: latch,从而提高性能.

是什么原因?

解决方法

API智能,std :: latch让你倒数而不会阻塞.想象一下,在其他任务开始之前你必须渲染172个毛边.你可以设置一个值为173的锁存器,并让每个线程完成一个向下的锁存器,并让应该消耗这些多余的线程在锁存器上等待.

工作线程将倒计时,但不要等待,因为它们有其他毛边可以渲染.如果他们进入睡眠状态,他们会使用其他同步原语来完成它.

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?的相关信息,请在本站查询。

本文标签: