草庐IT

std-span

全部标签

c++ - MSVCC/g++/icc 中 std deque/vector 之间的不同行为

我有一段非常简单的代码;#include#includeusingnamespacestd;classA{public:A(){};~A(){};dequemy_array;//vectormy_array;};intmain(void){}如果我在Linux上同时使用g++和icc/icpc编译这段代码,它编译得很好,即使使用-Wall也不会给出任何警告。如果我将双端队列交换为vector,情况是一样的。我想在Windows上使用MSVCC(cl)构建此代码,但不幸的是它会抛出错误c2027:errorC2027:useofundefinedtype'A'但是,如果我将std::de

c++ - 在不重新洗牌的情况下随机选择 std::vector 的所有元素一次的有效方法

我正在寻找一种有效的方法来选择对std::vector的每个元素的访问权以随机顺序,不重新洗牌或复制它们,即不使用std::random_shuffle并确保每个元素只被选择一次。我不想复制或重组a)T的每个实例可能是一个非常大的对象,并且b)对于我将对vector的元素执行的其他操作,它们更容易保持相同的顺序。此外,我真的不想走上不断挑选和拒绝重复的道路。很可能我会在vector中存储很多这样的大对象,效率是关键,因为我希望每秒多次调用这种随机选择方法。 最佳答案 创建一个与现有vector大小相同的vector,该vector使

c++ - std::logic_error 而不是返回 false

我正在寻找某人对std::logic_error用法的意见,而不是使用复杂的嵌套if/elseif列表返回true/false。我想从很多类似的函数中移动,如下面的函数boolvalidate_data(){std::vectorv;//fillwithdataif(v.find(10)==v.end()){returnfalse;}//otherchecksthatreturnfalse}到boolvalidate_data(){std::vectorv;//fillwithdataif(v.find(10)==v.end()){throwstd::logic_error("erro

c++ - 从 const char * 到 const std::string & 的转换

我认为以下代码会产生错误:#include#includestaticvoidpr(conststd::string&aStr){std::cout但gcc4.1.2编译成功。是不是std::string的构造函数妨碍了创建std::string的实例?我认为它不应该,因为引用只是一个变量的别名(在这种情况下,没有引用所引用的std::string类型的变量)。有没有人解释为什么代码编译成功?提前致谢。 最佳答案 是的,给定一个常量的引用,编译器可以/将合成一个临时的(在这种情况下是std::string类型)并将引用绑定(bind

c++ - 使用 std::shared_ptr 对象实例创建 boost::thread

我有以下两个代码段。第一个block按预期编译和工作。但是第二个block不编译。我的问题是,给定下面的代码,当尝试基于由shared_ptr代理的对象实例创建线程时,正确的语法是什么?#include#include#include#includestructfoo{voidboo(){}};intmain(){//Thisworks{foo*fptr=newfoo;boost::threadt(&foo::boo,fptr);t.join();deletefptr;}//Thisdoesn'twork{std::shared_ptrfptr(newfoo);boost::threa

c++ - 使用 std::string 时为 "error: no match for ‘operator<<"

你能帮我找出下面代码中的问题吗(代码类似于C++streamasaparameterwhenoverloadingoperator):#include#includeclasslogger{public:voidinit(std::ostream&ostr){stream=&ostr;}templatelogger&operator一切正常,直到我取消注释包含“world”的行。在这种情况下,GCC产生错误:在...中与“operator有意思的是VS2008对这段代码没有问题谢谢! 最佳答案 std::string("world"

c++ - 是否必须重置 std::array 元素?

std::arraymyInts;std::arraymyBools;可以将myInts和myBools的元素假设为false和0,还是我应该手动填充数组? 最佳答案 元素将被设置为随机值,但您可以确保像这样对它们进行值初始化:std::arraymyInts{};//allzeroesstd::arraymyBools{};//allfalse所以元素不必重新设置,它们可以被初始化为特定的值。您还可以将元素初始化为不同的值:std::arraymyInts{1,2,33,44};std::arraymyBools{true,fal

c++ - 使用 std::list 作为循环列表是否安全?

所以标准中定义了递增或递减end()迭代器?在Linux上,begin()被实现为end()++。#include#includeintmain(){std::listnumbers;for(inti=0;i所以每个平台上的输出总是一样的?输出:012345678901234567890123456789 最佳答案 递增从end()返回的迭代器任何标准C++库容器都会导致未定义的行为。由于std::list的大多数实现通用的实现细节它可能会增加list.end()但不能保证它确实如此。

c++ - 使用 std::accumulate 计算部分 vector 的总和

有这个vectorvectorv{1,2,3,4,5,6,7,8,9,10};如何使用accumulate计算它的前半部分的总和(即15)功能?我可以使用仅带有迭代器(而不是数字索引)的for循环来做到这一点吗? 最佳答案 你可以accumulate(v.begin(),v.begin()+int(v.size()/2),0)如果v是您的vector。你也可以写一个循环:intsum=0;for(vector::iteratorit=v.begin();it!=v.begin+int(v.size()/2);++it){sum+=*

c++ - 我可以用 std::chrono::high_resolution_clock 替换 SDL_GetTicks 吗?

检查来自C++的新内容,我找到了std::chrono库。我想知道std::chrono::high_resolution_clock是否可以很好地替代SDL_GetTicks? 最佳答案 使用std::chrono::high_resolution_clock的好处是避免在Uint32中存储时间点和持续时间。std::chrono库附带了各种各样的std::chrono::duration,您应该改用它们。这将使代码更具可读性,并减少歧义:Uint32t0=SDL_GetTicks();//...Uint32t1=SDL_GetT