每次我用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)
每次运行程序时,每次都输出相同的数字.有没有解决的办法?
我试过了:
#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) 我有一些文字(有意义的文字或算术表达),我想把它分成文字.
如果我有一个分隔符,我会使用:
std::stringstream stringStream(inputString);
std::string word;
while(std::getline(stringStream, word, delimiter))
{
wordVector.push_back(word);
}
Run Code Online (Sandbox Code Playgroud)
如何将字符串分成具有多个分隔符的标记?
不久之前,StackOverflow上有一个声誉很高的人在评论中写道,在调用(和类似的函数)之前必须抛出一个char
-argument .unsigned char
std::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 char
和signed char
?
这个班是这样的:
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)
调用未定义的行为?
上下文:这个答案 [删除,因为证明错误]加上其评论树.
下面显示的代码片段非常适合访问系统命令的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) 使用有什么好处[[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
关键字对我来说似乎有点太长,使得代码稍微难以阅读.
我想尽可能"严格"遵循标准,但值得使用吗?
如果我构造一个由空格分隔的浮点值列表组成的字符串,使用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
将不再使用.
有没有办法在不复制整个内容的情况下构造字符串?
考虑以下:
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 T
和const 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++中试验析构函数:
#include <iostream>
struct temp
{
~temp() { std::cout << "Hello!" << std::endl; }
};
int main()
{
temp t;
t.~temp();
}
Run Code Online (Sandbox Code Playgroud)
我看到"你好!" 正在打印两次.不应该调用析构函数释放对象,并且当它超出范围时不应该再次调用析构函数吗?或者还有其他一些概念吗?
(我不打算在实践中这样做.我只是想了解这里发生了什么.)