我需要一个文件系统库,用于支持C++ 11的编译器或支持C++ 14的编译器 - 所以它不能来自C++ 17.
现在,我知道进入C++ 17的文件系统库是基于Boost :: Filesystem的; 但是 - 它们是否足够相似,我可以使用Boost库,然后在以后无缝切换到标准版本,而不会更改,比如using声明?或两者之间是否存在(轻微/重大)差异?我知道,对于这种情况variant,Boost和标准库版本有很大不同.
我正在开展一个小项目并遇到以下情况:
std::string myString;
#GetValue() returns a char*
myString = myObject.GetValue();
Run Code Online (Sandbox Code Playgroud)
我的问题是如果GetValue() 返回NULL myString变为空字符串?这是不确定的?还是会发生段错?
我想知道我的文件系统在哪里找到了C++标准库的标题.特别是我正在寻找矢量模板的定义.我在/ usr/include /和各个子目录中搜索.我也试过'locate vector.h',它提出了很多矢量的实现,但不是标准的.我错过了什么?(分布是Gentoo)
背景:我正在分析一个在大多数情况下迭代向量的库,而gprof表明大部分时间花费在
std::vector<int, std::allocator<int> >::_M_insert_aux(
__gnu_cxx::__normal_iterator<int*, std::vector<
int, std::allocator<int> > >, int const&)
Run Code Online (Sandbox Code Playgroud)
可能这是std :: vector :: push_back内部发生的事情,但我不确定.
函数std :: shuffle已在C++ 11中引入:
template< class RandomIt, class URNG >
void shuffle( RandomIt first, RandomIt last, URNG&& g );
Run Code Online (Sandbox Code Playgroud)
它与std :: random_shuffle的重载之一具有相同的签名,这也是在C++ 11中引入的:
template< class RandomIt, class RandomFunc >
void random_shuffle( RandomIt first, RandomIt last, RandomFunc&& r );
Run Code Online (Sandbox Code Playgroud)
不同之处在于第三个参数,其中:
URNG必须满足UniformRandomNumberGenerator的要求
这都是?差异只是shuffle执行额外的编译时间检查吗?这个行为是否相同?
很长一段时间我一直在使用std::vector和std::shared_ptr携带.最近,std::shared_ptr<const T>每当需要指向const对象的指针时,我就开始使用它.这一切都没问题,因为std::shared_ptr<T>可以投射到std::shared_ptr<const T>然后它们共享相同的参考计数器,一切都很自然.
但是当我尝试使用像std::vector< std::shared_ptr<const T> >我这样的结构时遇到麻烦.为了简化,我将表示两种结构:
template <class T>
using SharedPtrVector = std::vector< std::shared_ptr<T> >;
template <class T>
using SharedConstPtrVector = std::vector< std::shared_ptr<const T> >;
Run Code Online (Sandbox Code Playgroud)
问题是,虽然SharedPtrVector和SharedConstPtrVector非常相似,SharedConstPtrVector但不能投SharedPtrVector.
所以每次我想成为一个const正确并写一个函数,如:
void f(const SharedConstPtrVector<T>& vec);
Run Code Online (Sandbox Code Playgroud)
我无法将const传递SharedPtrVector<T>给f.
我考虑了很多,并考虑了几种选择:
写转换功能
template <typename T>
SharedConstPtrVector<T> toConst(const SharedPtrVector<T>&);
Run Code Online (Sandbox Code Playgroud)以通用形式编写代码:
template <typename T>
void f(const std::vector< std::shared_ptr<T> >& vec);
Run Code Online (Sandbox Code Playgroud)
要么
template <typename TIterator>
void …Run Code Online (Sandbox Code Playgroud)问题是关于自我分配。例如,将向量复制到自身中:
std::vector<std::string> vec(5, "hello");
vec = vec;
Run Code Online (Sandbox Code Playgroud)
上面的代码应该对字符串执行5个字符串赋值操作,还是什么都不做?我的意思是以下检查是否有效:
std::vector operator=(const std::vector &rhs)
{
if (this == &rhs)
{ return *this; }
...
}
Run Code Online (Sandbox Code Playgroud)
我正在研究自己的std::variant类实现(只是为了好玩),并且对我是否应该在自赋值运算符的开头添加自赋值检查感兴趣,还是应该将包含的元素复制到自身中?
我了解这通常并不重要。您不应创建利用复制事实的类。但是我很感兴趣该标准是否对此有所说明。
有没有办法检查两个函数是否具有相同的签名?例如:
int funA (int a, int b);
int funB (int a, int b);
float funC (int a, int b);
int funD (float a, int b);
Run Code Online (Sandbox Code Playgroud)
在此示例中,funAand funB是应该返回的功能的唯一组合true。
我是C++的新手.我正在阅读迈克尔道森的"通过游戏编程开始C++".但是,我对编程并不陌生.我刚刚完成了一个处理向量的章节,所以我对它们在现实世界中的使用有疑问(我是一名计算机科学专业的学生,所以我还没有太多真实的经验).
作者在每章末尾都有一个Q/A,其中一个是:
问:我应该何时使用向量而不是数组?
答:差不多总是如此.向量是高效和灵活的.它们确实比阵列需要更多的内存,但这种权衡几乎总是值得的.
你们有什么感想?我记得在Java书中学习过向量,但是在我的Comp totro中我们根本没有介绍它们.科学.上课,也不是我在大学的数据结构课.我也从未见过它们用于任何编程任务(Java和C).虽然我知道学校代码和现实世界的代码可能会有很大不同,但这让我觉得它们并没有被大量使用.
我不需要被告知两个数据结构之间的差异; 我非常了解他们.我想知道的是,如果作者在他的Q/A中给出了很好的建议,或者他只是想让初学者程序员免于破坏管理固定大小数据结构的复杂性.另外,不管你怎么想作者的意见,你怎么看在现实世界往往?
谢谢,
杰拉德
我有一个返回指针和长度的函数,我想调用std::string::assign(pointer, length).clear当长度为零且指针可能为nullptr时,是否必须进行特殊情况(调用)?
C++标准说:
21.4.6.3 basic_string::assign
basic_string& assign(const charT* s, size_type n);
Requires: s points to an array of at least n elements of charT.
Run Code Online (Sandbox Code Playgroud)
那么如果n是零呢?什么是零字符数组,如何指向它?打电话有效吗?
s.assign(nullptr, 0);
Run Code Online (Sandbox Code Playgroud)
还是未定义的行为?
s当大小n为零时,libstdc ++的实现似乎不会取消引用指针,但这几乎不是保证.
你知道,有评论,例子和东西.
编码时需要快速参考.