我发现使用C++ STL方法进行简单的集合操作非常笨重.例如,要找到两组之间的差异:
std::set<int> newUserIds;
set_difference(currentUserIds.begin(), currentUserIds.end(), mPreviousUserIds.begin(), mPreviousUserIds.end(), std::inserter(newUserIds, newUserIds.end()));
std::set<int> missingUserIds;
set_difference(mPreviousUserIds.begin(), mPreviousUserIds.end(), currentUserIds.begin(), currentUserIds.end(), std::inserter(missingUserIds, missingUserIds.end()));
mPreviousUserIds = currentUserIds;
Run Code Online (Sandbox Code Playgroud)
boost是否提供了一组替代类,可以将上面的示例缩小为:
set_type<int> newUserIds = currentUserIds.difference(mPreviousUserIds);
set_type<int> missingUserIds = mPreviousUserIds.difference(currentUserIds);
Run Code Online (Sandbox Code Playgroud)
(类似于Qt中的QSet,它operator-
以这种方式覆盖.)
说我有这段代码:
#include <cmath>
// ...
float f = rand();
std::cout << sin(f) << " " << sin(f);
Run Code Online (Sandbox Code Playgroud)
作为sin(f)
一个定义明确的函数,有一个简单的优化:
float f = rand();
float sin_f = sin(f);
std::cout << sin_f << " " << sin_f;
Run Code Online (Sandbox Code Playgroud)
这是一个优化,期望现代C++编译器自己做的是合理的吗?或者编译器是否无法确定sin(f)
应始终为相等的值返回相同的值f
?
我有一个线程类,我偶尔会从中获取一个指针实例变量.我希望这个访问由互斥锁保护,以便阻止线程访问此资源,直到客户端完成其指针.
我最初的方法是返回一对对象:一个是指向资源的指针,另一个是指向互斥锁上的锁定对象的shared_ptr.此shared_ptr包含对锁对象的唯一引用,因此当超出范围时,应该解锁互斥锁.像这样的东西:
void A::getResource()
{
Lock* lock = new Lock(&mMutex);
return pair<Resource*, shared_ptr<Lock> >(
&mResource,
shared_ptr<Lock>(lock));
}
Run Code Online (Sandbox Code Playgroud)
此解决方案不太理想,因为它要求客户端保留整个对象.这样的行为打破了线程的安全性:
Resource* r = a.getResource().first;
Run Code Online (Sandbox Code Playgroud)
另外,我自己实现的是死锁,我很难确定原因,所以可能还有其他问题.
我想要的是一个shared_ptr,它包含作为实例变量的锁,并将其与访问资源的方法绑定在一起.这似乎应该有一个既定的设计模式,但做了一些研究,我很惊讶地发现它很难找到.
我的问题是:
(注意我正在使用Qt的代码库,但遗憾的是在这种情况下不能使用boost.但是,涉及提升的答案仍然是普遍感兴趣的.)
我正在创建一些UML图,我有很多实现接口的类.
这些类是否还需要列出接口的方法?这听起来很微不足道,但如果他们不这样做,将使图表看起来更简单.
这是一张显示我的意思的图片:
MyInterface的任何实现都需要method1,method2和method3 - 那么这些可以省略吗?
OpenCV函数cvtColor转换矩阵的颜色空间(例如,从RGB到灰度).函数的C++签名是
void cvtColor(InputArray src, OutputArray dst, int code, int dstCn=0 )
Run Code Online (Sandbox Code Playgroud)
可以使用此函数将矩阵转换到位,即使用src
相同的对象dst
吗?
cv::Mat mat = getColorImage();
cvtColor(mat, mat, CV_RGB2GRAY);
Run Code Online (Sandbox Code Playgroud)
(我知道无论哪种方式,因为目的地的通道数量不同于源,它仍然需要为目的地分配一个新的内存块.)
更一般地说,OpenCV API中是否有一个约定来确定何时可以以这种方式使用函数?
我正在使用jsoncpp从JSON文件中读取设置.
我想有两个级联设置文件,说MasterSettings.json
和LocalSettings.json
这里LocalSettings是MasterSettings的一个子集.我想先加载MasterSettings然后再加载LocalSettings.在LocalSettings的值与MasterSettings不同的情况下,该值将覆盖MasterSettings中的值.很像CSS中的级联.
用jsoncpp有没有优雅的方法呢?
Sometimes in a function I use std::move
to pass on a variable I'm no longer using, like this:
void f(std::vector<int> v)
{
for (int i: v)
{
std::cout << i << ", ";
}
}
void main()
{
std::vector<int> v(1000);
std::fill(v.begin(), v.end(), 42);
f(std::move(v));
}
Run Code Online (Sandbox Code Playgroud)
I understand the std::move leaves my vector in a valid state, so I could call v.clear()
and reuse it if I wanted to do so. But in a long function I may later add more …
我试图在我的项目中实现C++库的使用,该库未在其访问函数上使用const修饰符.到目前为止,我一直在我的所有代码中使用const,但是这个新库导致了两个主要问题:
如果这些参数是由库定义的类型,则作为const引用传递参数的函数不能使用参数的访问函数.
具有库定义的类型的成员对象的类不能在const函数中使用这些对象的访问函数.
克服这个问题的最佳方法是什么?最简单的解决方案是简单地从我的代码中删除所有const的使用,但这样做会非常令人沮丧.
附加信息:在这种情况下,我可以访问源代码,并且可以看到访问函数不会修改任何内容.我省略了这些信息,因为我对更一般的情况感兴趣.对于我的情况,const_cast
似乎是要走的路
PS图书馆作家并不邪恶!这是一个粗略和准备好的代码,他善于开源.我可以放弃图书馆并使用其他人注意到的更专业的东西.但是,对于这个时间有限的小项目,该库接口的简单性使其成为最佳选择.
在Boost中,有一些方便的功能可以让您在一行中填充容器.
例如,list_of允许您填写类似的列表.
#include <boost/assign/list_of.hpp> // for 'list_of()'
#include <list>
std::list<int> primes = boost::assign::list_of(2)(3)(5)(7)(11);
Run Code Online (Sandbox Code Playgroud)
在我的项目中我使用Qt并且不能使用Boost.有没有一种同样方便的方法来填充Qt的容器在施工点?
有什么办法可以decltype
在C ++宏中进行评估?我的主要动机是创建一个能够确定其类型this
并将其转换为字符串的宏。
如果无法使用,decltype
是否还有其他方法可以在类声明中使用宏来获取字符串的类类型?