草庐IT

c++ - 为什么不使用 std::getline 就可以调用 getline?

我正在阅读C++入门书并尝试所有代码示例。我对这个很感兴趣:#include#includeusingstd::string;usingstd::cin;usingstd::cout;usingstd::endl;intmain(){stringline;while(getline(cin,line))cout在编译这段代码之前我猜编译会失败,因为我没有使用while(std::getline(cin,line))为什么getline在全局命名空间中?据我了解,只有在我使用namespacestd;或usingstd::getline;我在LinuxMintDebianEdition上

c++ - 如何从 LPCTSTR 转换为 std::string?

我有一个LPCTSTR并想调用一个带有std::string参数的函数。我需要做什么转换? 最佳答案 冰山一角LPCTSTR可以是单字节或多字节字符串(取决于编译期间是否定义了UNICODE常量),而std::string的用户(包括您的函数)通常使用它来保存单字节字符串。您需要进行两次转换:一次用于LPCSTR(非UNICODE构建),一次用于LPCWSTR(UNICODE构建)。第一个很简单:std::stringconvert(LPCSTRstr){returnstd::string(str);}第二个需要先用WideChar

C++ vector 中的元素相乘

我一直在寻找以下问题的更优解决方案,但似乎找不到。假设我有一个vector:std::vectorvars={1,2,3}我要执行1*2*3我知道我可以做到以下几点:intmulti=1;for(inti=0;(i但是,是否有更“C++11”的方式来做到这一点?我真的很想用lambda来做到这一点这样我就可以计算vector的乘法(乘积)而无需类中的其他函数,我宁愿在函数中计算它。 最佳答案 是的,像往常一样,有一个算法(尽管这个算法在中),std::accumulate(liveexample):usingstd::begin;u

c++ - std::map 和 std::pair 的问题

我想执行一个小程序来测试一些东西#include#includeusingnamespacestd;struct_pos{floatxi;floatxf;booloperatorxim;struct_posk1={0,10};struct_posk2={10,15};struct_valv1={5.5};struct_valv2={12.3};m.insert(std::pair(k1,v1));m.insert(std::pair(k2,v2));return0;}问题是当我尝试编译它时,出现以下错误$g++m2.cpp-omtestInfileincludedfrom/usr/in

c++ - 如果没有 if,std::count_if 会更快吗?

这是gccstd::count_if代码templatetypenameiterator_traits::difference_typecount_if(_InputIterator__first,_InputIterator__last,_Predicate__pred){[snip]typenameiterator_traits::difference_type__n=0;for(;__first!=__last;++__first)if(__pred(*__first))++__n;return__n;}我的问题:使用它会更好(即更快)吗__n+=__pred(*__first)

c++ - 不闪烁地更新控制台 - C++

我正在尝试制作一个控制台侧滚动射击游戏,我知道这不是理想的媒介,但我给自己设置了一些挑战。问题是每当它更新框架时,整个控制台都在闪烁。有什么办法可以解决这个问题吗?我使用了一个数组来保存所有需要输出的字符,这是我的updateFrame函数。是的,我知道system("cls")是懒惰的,但除非那是问题的原因,否则我不会为此大惊小怪。voidupdateFrame(){system("cls");updateBattleField();std::this_thread::sleep_for(std::chrono::milliseconds(33));for(inty=0;y

c++ - std::cout 是否有返回值?

我很好奇std::cout是否有返回值,因为当我这样做时:cout打印了一些十六进制代码。这个打印出来的值是什么意思? 最佳答案 因为cout的操作数是用户定义的类型,表达式实际上是一个函数调用。编译器必须找到最好的operator匹配操作数,在本例中都是std::ostream类型.有许多候选运算符重载可供选择,但我将只描述按照通常的重载解析过程最终被选中的那个。std::ostream有一个转换运算符,允许转换为void*.这用于启用测试流的状态作为bool条件(即,它允许if(cout)工作)。右手操作数表达式cout隐式转换

c++ - 使用连续无符号整数列表初始化 std::vector<unsigned int>

我想用一种特殊的方法来初始化一个std::vector这在我用作引用的C++书籍中有所描述(如果重要的话,UlrichBreymann的德语书籍'DerC++Programmer')。在那本书中有一个关于STL序列类型的部分,特别提到了list,vector和deque.在本节中,他写道,这种序列类型有两个特殊的构造函数,即如果X指的是这样一种类型,X(n,t)//createsasequencewithncopiesoftX(i,j)//createsasequencefromtheelementsoftheinterval[i,j)我想在unsignedint的间隔内使用第二个,即

c++ - g++ 6.1 可能的 std::forward 回归 - 错误或预期行为?

g++6.1最近被引入到ArchLinux的测试库中,我的一些使用g++5.3.0成功编译的代码不再编译。我做了一个最小的例子:gcc.godbolt.orglink//Thiscodecompileswithg++5.3.0//Thisdoesnotcompilewithg++6.1#include#include#include#defineFWD(...)::std::forward(__VA_ARGS__)structsinker{templatevoidsink(T&){}};templatevoidcaller(T&v,TF&&f){sinkers;f(s,v);}temp

c++ - 在可见性有限的 `std::terminate` 函数中调用 `noexcept` - gcc vs clang codegen

考虑以下代码片段:voidf();voida(){f();}voidb()noexcept{f();}在上面的场景中,f的主体对于当前翻译单元中的编译器是不可见的。因此,由于b被标记为noexcept,必须在调用方生成额外的代码以确保异常被捕获并且std::terminate被调用。这就是clang++-Ofast-std=c++2a所做的(主干版本):a():#@a()jmpf()#TAILCALLb():#@b()pushraxcallf()popraxretmovrdi,raxcall__clang_call_terminate__clang_call_terminate:#@_