小编The*_*ect的帖子

c ++ deque vs queue vs stack

队列和堆栈是广泛提到的结构.但是,在C++中,对于队列,您可以通过两种方式完成:

#include <queue>
#include <deque>
Run Code Online (Sandbox Code Playgroud)

但对于堆栈,你只能这样做

#include <stack>
Run Code Online (Sandbox Code Playgroud)

我的问题是,队列和双端队列之间有什么区别,为什么提出两个结构?对于堆栈,可以包含任何其他结构吗?

c++ containers

73
推荐指数
6
解决办法
7万
查看次数

如何将 std::filesystem::file_time_type 转换为 time_t?

我使用 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 进行这种转换?

c++ c++-chrono

9
推荐指数
4
解决办法
3907
查看次数

为什么“[[fallthrough]]”需要方括号“[[]]”?

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++ c++17

7
推荐指数
1
解决办法
380
查看次数

push_back vs emplace_back到std :: vector <std :: string>

这里这里也存在类似的问题,但我认为我没有得到一个明确的答案然后我重新提出这个问题.

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 :: …

c++ string vector c++11

6
推荐指数
3
解决办法
1万
查看次数

C ++是否可以忽略函数中的异常?

我创建了一个引发异常的函数,但是在某些情况下,我希望它简单地忽略此异常。

我是这样写代码的,但是不太优雅:

try {
    myFunction();
} catch (...) {}
Run Code Online (Sandbox Code Playgroud)

C ++是否有另一种编写方法?

c++ exception-handling

5
推荐指数
2
解决办法
4802
查看次数

从文本文件到std :: vector <string>读取行的最有效方法

将从文本文件中提取的行添加到std :: vector <std :: string>中的常用方法,其中向量的每个元素对应于文件的行,如下例所示:

/sf/answers/585551711/

std::string line;
std::vector<std::string> myLines;
while (std::getline(myfile, line))
{
    myLines.push_back(line);
}
Run Code Online (Sandbox Code Playgroud)

或者也

/sf/answers/875473511/

std::vector<std::string> lines;
for (std::string line; std::getline( ifs, line ); /**/ )
    lines.push_back( line );
Run Code Online (Sandbox Code Playgroud)

是否存在一种最有效的方法来避免辅助字符串?

c++ fstream vector c++11

0
推荐指数
1
解决办法
572
查看次数