队列和堆栈是广泛提到的结构.但是,在C++中,对于队列,您可以通过两种方式完成:
#include <queue>
#include <deque>
Run Code Online (Sandbox Code Playgroud)
但对于堆栈,你只能这样做
#include <stack>
Run Code Online (Sandbox Code Playgroud)
我的问题是,队列和双端队列之间有什么区别,为什么提出两个结构?对于堆栈,可以包含任何其他结构吗?
我使用 MSVC2015 为 windows 编写了一个解决方案,其中以下代码转换 std::filesystem::last_write_time 结果 time_t:
time_t ftime = std::file_time_type::clock::to_time_t(fs::last_write_time("/Path/filename"))
Run Code Online (Sandbox Code Playgroud)
它运作良好。然后,当我尝试使用 gcc 9.3 (-std=C++2a) 将解决方案移植到 Linux 时,出现以下错误:
错误:'to_time_t' 不是 'std::chrono::time_point::clock' {aka 'std::filesystem::__file_clock'} 的成员
我搜索了一个解决方案,但我发现是基于解决方案包括上例中的std ::文件系统:: last_write_time在cplusplus.com。解决方法如下图:
auto ftime = fs::last_write_time(p);
std::time_t cftime = decltype(ftime)::clock::to_time_t(ftime);
Run Code Online (Sandbox Code Playgroud)
不幸的是,它对我不起作用。实际上,该示例有一条评论说它不适用于 MSVC(曾在 MSVC2015 上工作)或 GCC 9;C++20 将允许便携式输出。
现在,我被卡住了……我怎样才能使用 gcc 进行这种转换?
该switch语句具有管理其流程的命令,它们是break和[[fallthrough]]。
break强制流程跳出switch并[[fallthrough]]继续执行命令而忽略大小写验证(实际上这是 的默认行为switch)。例如:
switch (x) {
case 0:
...statements...
break; //will jump to (...after switch statements...)
case 1:
...statements...
[[fallthrough]]; //don't jump
case 2:
...statements... //will be executed if x == 1 or x == 2
}
...after switch statements...
Run Code Online (Sandbox Code Playgroud)
[[fallthrough]]如果break不是,为什么用方括号定义?
*该命令[[fallthrough]]是在 C++17 中引入的,如站点cppreference 所示。
这里和这里也存在类似的问题,但我认为我没有得到一个明确的答案然后我重新提出这个问题.
C++ 11标准有两种方法可以在向量的末尾添加一个新元素,它们是std :: vector :: push_back和std :: vector :: emplace_back.
它们之间的区别是std :: vector :: emplace_back构造对象到位,std :: vector :: push_back基本上复制对象(或基本类型)或将其移动到向量的末尾.
然后std :: vector :: push_back看起来更好的选择将原始类型添加到std :: vector中.例如:
std::vector<int> vVec;
vVec.push_back(10);
int iVar 30;
vVec.push_back(iVar);
Run Code Online (Sandbox Code Playgroud)
但是当我们谈论对象时,我并不是那么清楚.我们以std :: string的向量为例.如果我想添加一个文字字符串,我将使用std :: vector :: emplace_back,当我想复制或移动一个字符串对象时,我将使用std :: vector :: push_back?
为了更清楚我要问的内容,让我们看几个场景:
第一种情况:
std::vector<string> vVec;
std::string sTest(“1st scenario”);
vVec.push_back(sTest);
vVec.emplace_back(sTest);
Run Code Online (Sandbox Code Playgroud)
Push_back复制sTest并关联到vVec末尾的新元素,同时emplace_back在vVec的末尾创建字符串对象并将sTest的内容复制到其中.在这种情况下哪一个更有效或无关紧要?
第二种情况:
std::vector<string> vVec;
std::string sTest1(“2st scenario”);
std::string sTest2(“2st scenario”);
vVec.push_back(move(sTest1));
vVec.emplace_back(move(sTest2));
Run Code Online (Sandbox Code Playgroud)
Push_back已准备好移动语义,但emplace_back会发生什么?在这种情况下哪一个更有效?
第三种情况:
std::vector<string> vVec;
std::string sTest("3st scenario");
vVec.push_back(sTest.substr(4,4));
vVec.emplace_back(sTest.substr(4,4));
Run Code Online (Sandbox Code Playgroud)
因为std :: …
我创建了一个引发异常的函数,但是在某些情况下,我希望它简单地忽略此异常。
我是这样写代码的,但是不太优雅:
try {
myFunction();
} catch (...) {}
Run Code Online (Sandbox Code Playgroud)
C ++是否有另一种编写方法?
将从文本文件中提取的行添加到std :: vector <std :: string>中的常用方法,其中向量的每个元素对应于文件的行,如下例所示:
std::string line;
std::vector<std::string> myLines;
while (std::getline(myfile, line))
{
myLines.push_back(line);
}
Run Code Online (Sandbox Code Playgroud)
或者也
std::vector<std::string> lines;
for (std::string line; std::getline( ifs, line ); /**/ )
lines.push_back( line );
Run Code Online (Sandbox Code Playgroud)
是否存在一种最有效的方法来避免辅助字符串?