草庐IT

std-ranges

全部标签

c++ - operator bool() 转换为 std::string 并与 operator std::string() 冲突

在类中声明operatorstd::string时,operatorbool()怎么会导致错误,而且它本身还充当到string的隐式转换?#include#includeusingnamespacestd;classTest{public:operatorstd::string(){cout 最佳答案 您面临的问题(除了operatorstd::string()返回bool之外)是隐式转换在您需要和不需要时触发。当编译器看到s=t时,它会识别以下潜在的std::operator=匹配项://usingstd::stringforco

c++ - 在库 API 中传递 std::string

我们目前正在为某个库构建API。部分接口(interface)需要库获取并返回给用户类,如vector、string。当尝试在简单场景中模拟库的使用时,在Debug模式下,系统会在将字符串作为输入传递时崩溃。我相信在调试或Release模式下字符串类有不同的表示。然后我们的库假设接收到某种表示,错误地读取数据成员并一路崩溃。那么在API中传输STL对象的最佳方法是什么。目标操作系统是使用MSVC8编译的WindowsXP,尽管库用户将使用Windows,但他们的编译器可能(并且可能会)不同到目前为止我们的想法:将字符串更改为char*-但开发人员可能会对释放内存的责任感到困惑。使用我们

c++ - 我应该公开 protected std::vector 吗?

我有一个类,我打算让其他人继承。它有一个std::vector,我只希望开发人员能够读取它,但不能修改它,我的基本函数会修改它。我应该提供一个返回const迭代器的函数,还是将vector公开为protected。谢谢 最佳答案 如果将vector公开为protected,子类将能够修改它。因此,您应该公开返回const迭代器的方法。您可以使用Non-VirtualInterfaceidiom为用户和子类公开不同的接口(interface)。 关于c++-我应该公开protectedst

c++ - 避免 std::list 中的指针

我尽量避免有指针,而不是做std::list*>myList;voidaddElement(inta,intb){myList.push_back(newstd::pair(a,b));}我想我可以做类似的事情std::list>myList;voidaddElement(inta,intb){std::pairp(a,b);myList.push_back(p);}如果我对行为的理解正确,这应该存储对的拷贝,并在执行myList.clear()时自动删除它(与指针相反)。这是最好的方法吗?我可以期望编译器优化掉不必要的对象p吗? 最佳答案

C++ Linux : error: ‘move’ is not a member of ‘std’ how to get around it?

所以在我的VS2010上我可以编译如下代码:boost::shared_ptrinternal_thread;boost::packaged_taskinternal_task_w(boost::bind(&thread_pool::internal_run,this,internal_thread));internal_thread=boost::shared_ptr(newboost::thread(std::move(internal_task_w)));前两行在boost1.47.0和linux上没问题...但是在std::move上它给出了error:‘move’isnota

c++ - std::list<>:l.begin() 之前的元素

简短的问题:使用与我不同的其他编译器(mingw32),以下代码是否不安全,或者是否可以使用?listl;/*addelements*/list::iteratori=l.begin();i--;i++;cout...或者换句话说:i是否定义为指向此之后的l.begin()? 最佳答案 是的,代码是不安全的。一旦您尝试在begin()之前移动,您就会导致未定义的行为。尝试“再次返回”可能行不通。 关于c++-std::list:l.begin()之前的元素,我们在StackOverflo

c++ - std::map unique std::less<> 函数,用于 2D 点作为键

好吧,经过四个小时的调试,尽管我很困惑,但我找到了问题的原因......我正在制作一些程序,在std::map中保存一些点并在我的窗口中呈现这些点。但奇怪的是,有些点未能进入map。std::mapm_Props_m;voidAddProp(std::pairp){m_Props_m.insert(p);}structPoint2{unsignedintPoint2::x;unsignedintPoint2::y;//--------Point2::Point2():x(0),y(0){}boolPoint2::operator(constPoint2&b)const{return(x

c++ - 用于从 std::map 的最后 n 个元素创建 std::vector 的惯用 C++

从std::map的最后n个元素创建std::vector的C++惯用方法是什么?我对保留vector中的顺序不感兴趣。我可以像这样复制元素:std::mapm;size_tn=3;std::vectorv;std::map::iteratorit=m.end();while(n--){//assumingm.size()>=nit--;v.push_back(it->second);}但是,有没有其他更惯用的方法来做到这一点? 最佳答案 std::copy如果您想复制类型不变,那将是合适的。然而,std::map::iterato

c++ - 为 UDF std::unordered_map 提供 ":"运算符?

我正在围绕std::unorered_map编写一个包装器,但是我有点不确定我应该如何提供一个公共(public)成员函数来访问C++11中“:”特性提供的迭代,例如://Iteratethroughallunoredered_mapkeysfor(autox:my_map){//Processeachx}我如何通过围绕unordered_map的包装器提供与上述相同的功能?尝试过的解决方案:#include#includetemplateclassMyClass{private:std::unordered_mapmap;std::mutexmtx;public:MyClass(){

c++ - 尝试使用 std::add_const 将 T& 转换为 const T&

我有一个T&,它有一个函数的const和非常量版本。我想调用该函数的const版本。我尝试使用std::add_const将T&转换为constT&但它不起作用。我做错了什么,我该如何解决?这是一个简单的例子。voidf(int&){std::cout::type>(r));}输出:int& 最佳答案 类型特征是解决这个问题的一种非常费力的方法。只需使用模板类型推导:voidf(int&){std::coutconstT&make_const(T&t){returnt;}intmain(){inta=0;int&r=a;f(make