小编Bau*_*gen的帖子

为什么rand()在每次运行时产生相同的数字序列?

每次我用rand()它运行程序都会给我相同的结果.

示例:

#include <iostream>
#include <cstdlib>

using namespace std;

int random (int low, int high) {
    if (low > high) return high;
    return low + (rand() % (high - low + 1));
}
int main (int argc, char* argv []) {
    for (int i = 0; i < 5; i++) cout << random (2, 5) << endl;
}
Run Code Online (Sandbox Code Playgroud)

输出:

3
5
4
2
3
Run Code Online (Sandbox Code Playgroud)

每次运行程序时,每次都输出相同的数字.有没有解决的办法?

c++ random

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

如何将std :: vector的大小作为int?

我试过了:

#include <vector>

int main () {
    std::vector<int> v;
    int size = v.size;
}
Run Code Online (Sandbox Code Playgroud)

但得到了错误:

cannot convert 'std::vector<int>::size' from type 'std::vector<int>::size_type (std::vector<int>::)() const noexcept' {aka 'long unsigned int (std::vector<int>::)() const noexcept'} to type 'int'
Run Code Online (Sandbox Code Playgroud)

将表达式转换为int如下:

#include <vector>

int main () {
    std::vector<int> v;
    int size = (int)v.size;
}
Run Code Online (Sandbox Code Playgroud)

也会产生错误:

error: invalid use of member function 'std::vector<_Tp, _Alloc>::size_type std::vector<_Tp, _Alloc>::size() const [with _Tp = int; _Alloc = std::allocator<int>; std::vector<_Tp, _Alloc>::size_type = long unsigned int]' (did you forget the '()' …
Run Code Online (Sandbox Code Playgroud)

c++ size const vector unsigned-integer

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

通过多个分隔符将字符串拆分为单词

我有一些文字(有意义的文字或算术表达),我想把它分成文字.
如果我有一个分隔符,我会使用:

std::stringstream stringStream(inputString);
std::string word;
while(std::getline(stringStream, word, delimiter)) 
{
    wordVector.push_back(word);
}
Run Code Online (Sandbox Code Playgroud)

如何将字符串分成具有多个分隔符的标记?

c++ string token delimiter

31
推荐指数
4
解决办法
5万
查看次数

在调用toupper(),tolower()等之前,是否需要转换为unsigned char?

不久之前,StackOverflow上有一个声誉很高的人在评论中写道,在调用(和类似的函数)之前必须抛出一个char-argument .unsigned charstd::toupper

另一方面,Bjarne Stroustrup没有提到在C++ - Programming Language中这样做的必要性.他只是std::tolower喜欢用

string name = "Niels Stroustrup";

void m3() {
  string s = name.substr(6,10);  // s = "Stroustr up"
  name.replace(0,5,"nicholas");  // name becomes "nicholas Stroustrup"
  name[0] = toupper(name[0]);   // name becomes "Nicholas Stroustrup"
} 
Run Code Online (Sandbox Code Playgroud)

(引用自该书,第4版.)

参考文献说输入需要表示为toupper.对我来说,这听起来像每个unsigned char以后都有,char并且char具有相同的大小.

那么这个演员是不必要的还是Stroustrup不小心?

编辑:libstdc ++手册提到输入字符必须来自基本源字符集,但不会强制转换.我想这是由@Keith Thompson的回复所涵盖的,他们都有积极的表现unsigned charsigned char

c++ undefined-behavior language-lawyer toupper tolower

30
推荐指数
2
解决办法
2841
查看次数

具有已删除的复制构造函数的类是否可以轻易复制?

这个班是这样的:

class A {
  public:
    A() = default;
    A(const A&) = delete;
};
Run Code Online (Sandbox Code Playgroud)

平凡的可复制?(至少clang似乎这么认为(现场))

会特别的

A a,b;
std::memcpy(&a, &b, sizeof(A));
Run Code Online (Sandbox Code Playgroud)

调用未定义的行为?

上下文:这个答案 [删除,因为证明错误]加上其评论树.

c++ language-lawyer

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

node.js - 访问系统命令的退出代码和stderr

下面显示的代码片段非常适合访问系统命令的stdout.是否有某种方法可以修改此代码,以便还可以访问系统命令的退出代码以及系统命令发送给stderr的任何输出?

#!/usr/bin/node
var child_process = require('child_process');
function systemSync(cmd) {
  return child_process.execSync(cmd).toString();
};
console.log(systemSync('pwd'));
Run Code Online (Sandbox Code Playgroud)

javascript node.js

28
推荐指数
3
解决办法
2万
查看次数

我什么时候应该[[maybe_unused]]?

使用有什么好处[[maybe_unused]]?考虑

int winmain(int instance, int /*prevInstance*/, const char */*cmdline*/, int show);

int winmain(int instance, [[maybe_unused]] int prevInstance, [[maybe_unused]] const char *cmdline, int show);
Run Code Online (Sandbox Code Playgroud)

有些人可能会坚持使用评论是丑陋的,因为这个关键字是在这些情况下制作并打算使用的,我完全同意它,但maybe_unused关键字对我来说似乎有点太长,使得代码稍微难以阅读.

我想尽可能"严格"遵循标准,但值得使用吗?

c++ c++17

28
推荐指数
2
解决办法
3964
查看次数

将字符串移出std :: ostringstream

如果我构造一个由空格分隔的浮点值列表组成的字符串,使用std::ostringstream:

std::ostringstream ss;
unsigned int s = floatData.size();
for(unsigned int i=0;i<s;i++)
{
    ss << floatData[i] << " ";
}
Run Code Online (Sandbox Code Playgroud)

然后我得到一个结果std::string:

std::string textValues(ss.str());
Run Code Online (Sandbox Code Playgroud)

但是,这将导致不必要的字符串内容的深层副本,因为ss将不再使用.

有没有办法在不复制整个内容的情况下构造字符串?

c++ ostringstream move-semantics c++11

27
推荐指数
3
解决办法
3628
查看次数

模板通过const指针选择const引用

考虑以下:

template <class T> void Foo(const T* x) {
  std::cout << "I am the pointer overload" << std::endl;
}

template <class T> void Foo(const T& x) {
  std::cout << "I am the reference overload" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

鉴于上述情况,我希望以下内容可以调用指针重载:

int* x;
Foo(x);
Run Code Online (Sandbox Code Playgroud)

但事实并非如此.这对我来说似乎很奇怪,因为它const T*可以清楚地绑定到非const Tconst T&can,但是指针变体似乎是"更适合".

对于我的应用程序,我希望调用指针变体.我可以通过额外的专业化来完成这项工作:

template <class T> void Foo(T* x) {
  const T* const_x = x;
  Foo(const_x);
}
Run Code Online (Sandbox Code Playgroud)

但那感到错误和不必要.有没有更好的办法?我不理解的是什么(除了标准的xyz部分说这是这样的)?

c++ templates c++11

24
推荐指数
2
解决办法
1260
查看次数

在显式调用时,析构函数被调用两次

我用这段代码在C++中试验析构函数:

#include <iostream>

struct temp
{
    ~temp() { std::cout << "Hello!" << std::endl; }
};

int main()
{
    temp t;
    t.~temp();
}
Run Code Online (Sandbox Code Playgroud)

我看到"你好!" 正在打印两次.不应该调用析构函数释放对象,并且当它超出范围时不应该再次调用析构函数吗?或者还有其他一些概念吗?

(我不打算在实践中这样做.我只是想了解这里发生了什么.)

c++ destructor

22
推荐指数
2
解决办法
7183
查看次数