小编Pav*_*Dev的帖子

为什么路径的迭代器在遍历时返回“ \\”?

我正在使用带有文件系统API的新的和现代的C ++ 17。我正在Windows中使用Visual Studio 2017。

以下代码给出了意外的结果:

#include <iostream>
#include <filesystem>

int main()
{
  std::filesystem::path path(R"(D:\dir\file.cpp)");
  for (auto& dir : path)
  {
    std::cout<<dir<<std::endl;
  }
}

Run Code Online (Sandbox Code Playgroud)

结果是:

"D:"
"\\"
"dir"
"file.cpp"
Run Code Online (Sandbox Code Playgroud)

为什么打印“ \\”?

在GCC 9.1.0中对此进行测试(请在路径变量中将“ \”更改为“ /”),结果是:

"D:"
"dir"
"file.cpp"
Run Code Online (Sandbox Code Playgroud)

为什么行为不同?

根据C ++ 17标准,哪个结果正确?

c++ c++17

12
推荐指数
1
解决办法
194
查看次数

标准是否保证了向量元素的初始化顺序?

为了填充std::vector<struct_name>from std::cin,我通常写如下代码:

struct point{
    int x, y;
};

int main()
{
   std::size_t n;
   std::cin>>n; 
   std::vector<point> vec(n);
    for (auto& p:vec) 
        std::cin>>p.x>>p.y;
   //...
}
Run Code Online (Sandbox Code Playgroud)

但是今天我发现了另一种使用默认构造函数的方法:

struct point{
int x, y;
   point(){
      std::cin>>x>>y;
   }
};

int main()
{
    std::size_t n;
    std::cin>>n; 
    std::vector<point> vec(n);
    //...
}
Run Code Online (Sandbox Code Playgroud)

问题

  1. 向量元素的初始化顺序是否由标准(0,1,2,n-1...)保证?
  2. (如果上一个问题的答案是正确的)第二个变体真的有两次有效吗?

我对根据 C++11(和更新的)标准的行为感兴趣

c++ language-lawyer

11
推荐指数
2
解决办法
754
查看次数

仅使用标准库设置文件创建时间

C ++ 17包括一个新的可移植API,用于处理文件系统(<filesystem>)。

我的程序解压缩了一个存档。该档案包含文件,目录和每个文件的创建时间。有了新的API,我有了一个可移植的solotution,用于创建目录(std::filesystem::create_directories),并且正在std::ofstream用于创建文件。

我可以使用新的API设置文件创建(或修改)时间吗?

编辑:时间,由归档提供的时间-是秒,从1970.01.01 00:00:00(UNIX纪元时间)开始

c++ portability c++17

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

如何快速将一个大整数分成一个单词?

我目前正在开发一个类来处理大的无符号整数。但是,我需要不完整的功能,即:

\n
    \n
  1. bi_uint+=bi_uint- 已经实施。没什么好抱怨的。
  2. \n
  3. bi_uint*=std::uint_fast64_t- 已经实施。没什么好抱怨的。
  4. \n
  5. bi_uint/=std::uint_fast64_t- 已实现,但工作速度非常,还需要两倍宽的类型uint_fast64_t。在测试用例中,除法比乘法慢35倍
  6. \n
\n

接下来,我将给出我的除法实现,它基于一个简单的长除法算法:

\n
#include <climits>\n#include <cstdint>\n#include <limits>\n#include <vector>\n\nclass bi_uint\n{\npublic:\n    using u64_t = std::uint_fast64_t;\n    constexpr static std::size_t u64_bits = CHAR_BIT * sizeof(u64_t);\n    using u128_t = unsigned __int128;\n    static_assert(sizeof(u128_t) >= sizeof(u64_t) * 2);\n\n    //little-endian\n    std::vector<u64_t> data;\n\n    //User should guarantee data.size()>0 and val>0\n    void self_div(const u64_t val)\n    {\n        auto it = data.rbegin();\n\n        if(data.size() == 1) {\n            *it /= val;\n            return;\n        }    \n        \n …
Run Code Online (Sandbox Code Playgroud)

c++ algorithm biginteger integer-division c++20

5
推荐指数
1
解决办法
549
查看次数

如何在模板专业化中检测C风格的多维数组?

我有以下代码:

enum type_kind{unkown=-1,carray, multi_carray};

template<class T>
struct detect_carray{
   constexpr static int kind=unkown;
};
template<class T, std::size_t N>
struct detect_carray<T[N]>{
   constexpr static int kind=carray;
};
Run Code Online (Sandbox Code Playgroud)

现在,我想添加另一个专门用于检测 C 风格的多维数组的专业化,即T[a][b]....

实现此目的的语法是什么?我可以使用可变参数模板吗?

我期望以下行为:

int main()
{
std::cout<<detect_carray<std::vector<int>>::kind;//-1
std::cout<<detect_carray<int[3]>::kind;//0
std::cout<<detect_carray<double[3][5]>::kind;//1
std::cout<<detect_carray<std::complex<double>[3][5][8][16]>::kind;//1
//Correct out: -1011
}
Run Code Online (Sandbox Code Playgroud)

c++ templates c++17 c++20

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