就时空复杂度而言,以下哪一项是迭代std :: vector的最佳方法,为什么?
方法1:
for(std::vector<T>::iterator it = v.begin(); it != v.end(); ++it) {
/* std::cout << *it; ... */
}
Run Code Online (Sandbox Code Playgroud)
方式2:
for(std::vector<int>::size_type i = 0; i != v.size(); i++) {
/* std::cout << v[i]; ... */
}
Run Code Online (Sandbox Code Playgroud)
方式三:
for(size_t i = 0; i != v.size(); i++) {
/* std::cout << v[i]; ... */
}
Run Code Online (Sandbox Code Playgroud)
方式4:
for(auto const& value: a) {
/* std::cout << value; ... */
Run Code Online (Sandbox Code Playgroud) 我读了C++ 17 Standard $ 8.5.7.4:
表达E1在表达E2之前测序.
换班运营商.
此外cppreference第19条说:
In a shift operator expression E1<<E2 and E1>>E2, every value
computation and side-effect of E1 is sequenced before every value
computation and side effect of E2
Run Code Online (Sandbox Code Playgroud)
但是当我尝试使用gcc 7.3.0或clang 6.0.0编译以下代码时
#include <iostream>
using namespace std;
int main() {
int i = 5;
cout << (i++ << i) << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我得到以下gcc警告:
../src/Cpp_shift.cpp: In function ‘int main()’:
../src/Cpp_shift.cpp:6:12: warning: operation on ‘i’ may be undefined [-Wsequence-point]
cout << (i++ << …
Run Code Online (Sandbox Code Playgroud) 请在下面找到代码片段:
class tFunc{
int x;
public:
tFunc(){
cout<<"Constructed : "<<this<<endl;
x = 1;
}
~tFunc(){
cout<<"Destroyed : "<<this<<endl;
}
void operator()(){
x += 10;
cout<<"Thread running at : "<<x<<endl;
}
int getX(){ return x; }
};
int main()
{
tFunc t;
thread t1(t);
if(t1.joinable())
{
cout<<"Thread is joining..."<<endl;
t1.join();
}
cout<<"x : "<<t.getX()<<endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我得到的输出是:
Constructed : 0x7ffe27d1b0a4
Destroyed : 0x7ffe27d1b06c
Thread is joining...
Thread running at : 11
Destroyed : 0x2029c28
x : 1
Destroyed : 0x7ffe27d1b0a4 …
Run Code Online (Sandbox Code Playgroud) 我需要帮助我的程序错误检查.我要求用户输入一个整数,我想检查用户输入是否是整数.如果没有,请重复scanf.
我的代码:
int main(void){
int number1, number2;
int sum;
//asks user for integers to add
printf("Please enter the first integer to add.");
scanf("%d",&number1);
printf("Please enter the second integer to add.");
scanf("%d",&number2);
//adds integers
sum = number1 + number2;
//prints sum
printf("Sum of %d and %d = %d \n",number1, number2, sum);
//checks if sum is divisable by 3
if(sum%3 == 0){
printf("The sum of these two integers is a multiple of 3!\n");
}else {
printf("The sum of these two integers is …
Run Code Online (Sandbox Code Playgroud) 我正在学习C中的指针.我对下面的程序如何工作感到困惑
int main()
{
int x=30, *y, *z;
y=&x;
z=y;
*y++=*z++;
x++;
printf("x=%d, y=%p, z=%p\n", x, y, z);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出是
x=31, y=0x7ffd6c3e1e70, z=0x7ffd6c3e1e70
Run Code Online (Sandbox Code Playgroud)
y
并z
指向变量的下一个整数地址x
.我无法理解这条线是如何工作的
*y++=*z++;
Run Code Online (Sandbox Code Playgroud)
有人可以解释一下C如何理解这一行吗?
我正在尝试将 uint8_t [uint8_tlets_try[16]] 数组“翻译”为 16*8+1[null character] 元素的字符串。例如:
lets_try[0] = 10101010
lets_try[1] = 01010101
Run Code Online (Sandbox Code Playgroud)
...
我想要一个像这样的字符串:
1010101001010101...[\0]
这里的问题是:1)有没有一种快速的方法来执行这个操作?
我试图自己做;我的想法是从将单个 uint8_t 变量转换为字符串并使用循环获取完整数组开始[我还没有完成最后一部分]。最后我写了这段代码:
int main()
{
uint8_t example = 0x14;
uint8_t *pointer;
char *final_string;
pointer = &example;
final_string = convert(pointer);
puts(final_string);
return(0);
}
char *convert (uint8_t *a)
{
int buffer1[9];
char buffer2[9];
int i;
char *buffer_pointer;
buffer1[8]='\0';
for(i=0; i<=7; i++)
buffer1[7-i]=( ((*a)>>i)&(0x01) );
for(i=0; i<=7; i++)
buffer2[i] = buffer1[i] + '0';
buffer2[8] = '\0';
puts(buffer2);
buffer_pointer = buffer2;
return buffer_pointer;
}
Run Code Online (Sandbox Code Playgroud)
这里还有几个问题:
2)我不确定我是否完全理解我在网上找到的这个表达式的魔力:buffer2[i] …
我在很多 SO 答案中都看到过这种代码:
template <typename T>
inline T imax (T a, T b)
{
return (a > b) * a + (a <= b) * b;
}
Run Code Online (Sandbox Code Playgroud)
哪里有作者说这个无分支。
但这在当前架构上真的是无分支的吗?(x86, ARM...) 是否有真正的标准保证这是无分支的?
大家好,新年快乐!
我很难理解C语言中的指针.据我所知,指针是一个存储常规变量地址的特殊变量.
我正在发布两个相同的代码示例.在第一次我输入scanf中&d1.am
.
在第二个示例中,如果我更改&d1.am
为ptd1.am
它会弹出编译错误,我无法理解为什么.
struct student{
int am;
char stname[20];
char stsurname[20];
};
int main(){
struct student d1;
printf("1st student\n");
printf("Enter am\n");
scanf("%d", &d1.am)
Run Code Online (Sandbox Code Playgroud)
第二个等效样本:
struct student{
int am;
char stname[20];
char stsurname[20];
};
int main(){
struct student d1;
struct student *ptd1;
ptd1=&d1;
printf("1st student\n");
printf("Enter am\n");
scanf("%d", &(*ptd1).am);
Run Code Online (Sandbox Code Playgroud)
我知道正确的是键入&(*ptd1).am
但我无法理解为什么.如何&(*ptd1).am
等于&d1.am
和不等ptd1.am
?我打字清楚了ptd1=&d1
!
在此先感谢您的帮助!
这是我的代码
#include <stdio.h>
main()
{
int c;
c=getchar();
while(c!=EOF)
{
int x;
x=(c!=EOF);
printf("%d",x);
putchar(c);
c=getchar();
}
}
Run Code Online (Sandbox Code Playgroud)
输出(当我输入时A
):
A
1A1
Run Code Online (Sandbox Code Playgroud)
为什么1A
不仅如此。为什么要重复1
。像第一个一样,程序将从getchar中获取c的值。然后它将进入循环。当condition为true时,它将打印x的值,然后打印c的值。再一次,它应该要求我提供输入。而是显示另一个1,然后要求输入。请帮助。
我在 c++ 中遇到了与以下类似的代码,但我不确定它到底做了什么。
*x++ = *y++;
Run Code Online (Sandbox Code Playgroud)
x
和y
是对uint32
s 的引用。
我知道这++
是后增量运算符和*
取消引用,但我仍然不确定它到底是做什么的。
c ×5
c++ ×5
pointers ×3
arrays ×1
c++17 ×1
comparison ×1
destructor ×1
if-statement ×1
iterator ×1
performance ×1
scanf ×1
stl ×1
string ×1
uint8t ×1