小编Ayx*_*xan的帖子

使用QFile将换行符转换为文本文件

我想把一个换行符放到一个txt文件中,我尝试了很多替代方案,在这个论坛上有这么多的帮助,但我总是得到永远不为人知的角色.请帮忙

for (int i = 0; i < fileDet.size(); i++) {
  qDebug() << "Name directory" << fileDet.at(i);
  QFile data("output.txt");
  if (data.open(QFile::Append)) {
    QTextStream out(&data);
    out << fileDet.at(i);  //<<'\n';
    out << QChar((int)'\n');
  }
  data.close();
}
Run Code Online (Sandbox Code Playgroud)

qt qt4

8
推荐指数
2
解决办法
1万
查看次数

为什么std :: span缺少size_type?

我一直在更新使用homebrew span类的旧代码,使之更符合C ++ 20的要求,std::span并且由于std::span没有size_type和有,我遇到了编译错误index_type。关于是否index_type应该签名已经发生了巨大的变化,但是为什么要跳过size_type呢?这会破坏期望容器(或类似容器的对象)具有的通用代码size_type

c++ c++20 std-span

8
推荐指数
2
解决办法
549
查看次数

即使未指定某些元素,C中的静态分配数组也会使用其所有内存吗?

考虑以下代码:

int array[1000000];
array[1] = 1;
array[10] = 10;
Run Code Online (Sandbox Code Playgroud)

我们已经为该数组静态分配了大小为1000000的内存。但是是否全部使用了这些内存?

我的意思是如果我们改为这样做:

int *array = malloc(sizeof(int) * 1000000);
array[1] = 1;
array[10] = 10;
Run Code Online (Sandbox Code Playgroud)

然后看来,实际上我们实际上使用了所有这1000000个空间:由于我们已经分配了它们,因此它们无法用于内存中的其他任何空间。但是对于静态分配的数组,事物未初始化,因此事物仍可以存储在没有设置值的其余999998点中。

本质上,我要问的是:int array[num]使用的内存将少于int array = malloc(sizeof(int) * num)

c

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

NULL保证为0吗?

我想知道是否NULL保证使用0C++,所以我搜索并发现了这些:


这个答案表明:

这是Bjarne Stroustrup的措辞,

在C++中,NULL的定义是0,因此只有美学差异.我更喜欢避免宏,所以我使用0. NULL的另一个问题是人们有时会错误地认为它与0不同和/或不是整数.

这似乎证实NULL总是0.


但根据cppreference.com:

#define NULL /*implementation-defined*/
Run Code Online (Sandbox Code Playgroud)

宏NULL是一个实现定义的空指针常量,可能是:

- >整数类型的整数常量表达式rvalue,其计算结果为零(直到C++ 11)

- >值为零的整数文字,或类型为std :: nullptr_t的prvalue(自C++ 11起)

这清楚地说NULL是依赖于实现.


这个答案说:

0(也称为C的NULL桥接到C++中)可能导致重载函数解析的模糊性,除其他外:

f(int); 
f(foo *);
Run Code Online (Sandbox Code Playgroud)

这再次暗示这NULL是整数0,可能会导致歧义


我遇到了其他问题和答案,但它们主要是关于C语言,而不是C++.这里的一个评论说:

并且NULL保证为0

但同样,这是关于C.


总而言之,NULL总是0在C++中?C怎么样?是(对于每个标准实现)是否相同:

#define NULL 0
Run Code Online (Sandbox Code Playgroud)

注意:这个问题与空指针无关,问题是NULL在C++中是否保证是0整数.它是依赖于实现的吗?

c++ null

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

在C ++中被局部声明隐藏的封闭范围(非全局)中访问变量?

范围解析运算符::可用于访问由局部声明隐藏的全局变量。对于在封闭范围内声明但不在全局范围内声明的变量,如何实现相同的目的?

int main() {
  int i = 10;

  if (1) {
    int i = 5;
    std::cout << "Local i: " << i << std::endl;

    std::cout << "Main's i: " << ?? << std::endl; //How to access main's i?
  }

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

我知道这是不好的做法。但是我只是想知道这是否可行。我认为不是。

解释为什么不可能或怎么做将很有用。

c++

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

将整数转换为指针总是定义明确吗?

这是有效的 C++ 吗?

int main() {
    int *p;
    p = reinterpret_cast<int*>(42);
}
Run Code Online (Sandbox Code Playgroud)

假设我从不取消引用p.

查找 C++ 标准,我们有

C++17 §6.9.2/3 [basic.compound]

3指针类型的每个值都是以下之一:

  • 指向对象或函数的指针(该指针被称为指向该对象或函数),或
  • 超过对象末尾的指针 ([expr.add]),或
  • 该类型的空指针值 ([conv.ptr]),或
  • 无效的指针值。

指向或越过对象末尾的指针类型的值表示该对象占用的内存([intro.memory])中的第一个字节或存储结束后的内存中的第一个字节的地址分别被对象占用。[ 注意:超过对象结尾的指针 ([expr.add]) 不被认为指向可能位于该地址的对象类型的无关对象。指针值在它所表示的存储到达其存储持续时间的末尾时变为无效;参见 [basic.stc]。— 尾注 ] 出于指针算术 ([expr.add]) 和比较 ([expr.rel], [expr.eq]) 的目的,

p = reinterpret_cast<int*>(42);不适合可能值的列表。和:

C++17 §8.2.10/5 [expr.reinterpret.cast]

整数类型或枚举类型的值可以显式转换为指针。一个指针转换为一个足够大的整数(如果实现中存在这样的整数)并返回到相同的指针类型将具有其原始值;指针和整数之间的映射是由实现定义的。[ 注意:除了 6.7.4.3 中描述的那样,这种转换的结果不会是安全派生的指针值。— 尾注 ]

C++ 标准似乎没有更多地说明整数到指针的转换。查找 C17 标准:

C17 §6.3.2.3/5(强调我的)

整数可以转换为任何指针类型。除了前面指定的之外,结果是实现定义的,可能没有正确对齐,可能没有指向引用类型的实体,并且可能是陷阱表示0.68)

C17 §6.2.6.1/5

某些对象表示不需要表示对象类型的值。如果对象的存储值具有这样的表示形式并且被没有字符类型的左值表达式读取,则行为未定义。如果这种表示是由没有字符类型的左值表达式修改对象的全部或任何部分的副作用产生的,则行为是未定义的。50) 这种表示称为陷阱表示。

对我来说,似乎任何不符合 [basic.compound] 列表的值都是陷阱表示,因此p = reinterpret_cast<int*>(42);是 UB。我对么?还有其他东西使p = …

c++ pointers casting language-lawyer reinterpret-cast

7
推荐指数
2
解决办法
475
查看次数

#include &lt;Windows.h&gt; 是不好的做法吗?

我认为人们普遍认为这#include <bits/stdc++.h>是不好的做法,部分原因是它解析并包含每个标准标头,这几乎总是不必要的(它也是不可移植的,但这超出了我的观点)。当联合这更糟糕using namespace std;,因为现在你有一吨的通用名称的命名空间,喜欢next

然而,这似乎#include <Windows.h>主要被认为是可以的(我见过的大多数 Win32 程序都使用它),即使它在概念上与#include <bits/stdc++.h>+的组合做同样的事情using namespace std;

根据维基百科

windows.h是 C 和 C++ 编程语言的 Windows 特定头文件,其中包含 Windows API 中所有函数的声明、Windows 程序员使用的所有常用宏以及各种函数使用的所有数据类型和子系统。它定义了大量可在 C 中使用的 Windows 特定函数。

为什么会这样?是否不可能包含我们使用的特定标题而不包含<Windows.h>

c++ winapi

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

如何在小于 O(N) 的时间内解决这个问题?

我有一个排序(升序)元素的数组作为输入。我想找出这些元素是否构成一个系列,其中每个当前元素都可以被它之前的所有元素整除。这是我能想到的 O(n) 时间内这个问题的明显解决方案:

bool CheckArray(int arr[], int no_of_elements)
{
    if (no_of_elements == 1)
        return true;

    for (int i = 1; i < no_of_elements; i++)
        if (arr[i] % arr[i - 1] != 0)
            return false;
    return true;
}
Run Code Online (Sandbox Code Playgroud)

示例 1:输入:3 6 9 12 输出:假

示例 2:输入:3 6 12 输出:真

有没有什么办法可以在小于 O(n) 的时间内做到这一点?如果是,如何?

c++ time-complexity

6
推荐指数
2
解决办法
141
查看次数

如何使用 std span 进行边界检查?

std::vector几乎所有其他容器都有一种非常方便的边界检查方法:at(). std::span显然没有那个。

c++ outofrangeexception c++20 std-span

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

有效地检查一个字符串是否是另一个字符串的近似子字符串(近似约束在另一个字符串中),直到给定的错误阈值?

取两个 C 或 C++ 字符串,s1并且s2. 检查一个是否完全包含另一个是相当简单的。

true如果s2是 的子字符串,则返回以下内容s1

在C中:

strstr(s1, s2)
Run Code Online (Sandbox Code Playgroud)

在 C++ 中:

#include <string>
str.find(str2) != string::npos
Run Code Online (Sandbox Code Playgroud)

随着升压:

#include <boost/algorithm/string.hpp>
boost::algorithm::contains(s1, s2)
Run Code Online (Sandbox Code Playgroud)

我正在寻找的是一种类似的方法,可以有效地(在速度方面,而不是内存方面)查找一个字符串是否大约包含在 / 大约是另一个字符串的子串中,直到给定的差异阈值。agrep与 Unix 系统中查找文件的 bash 命令非常相似。

例如,假设该函数被称为approx_contains. 如果包含在编辑距离最多为 4 的范围内,则approx_contains(s1, s2, 4)可以返回 true/false 。s2s1

在网上搜索时,我只发现了大量关于如何计算两个字符串之间的 Levenshtein 距离的参考文献和问题,或者关于近似字符串模式匹配的理论算法,这些算法不仅仅是简单地检查一个字符串是否包含另一个字符串 - 这在这里变得浪费。

非常努力地避免重新发明轮子,怎么可能有人在 C 或 C++ 中进行这样的检查?

c c++ string matching agrep

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