小编mch*_*mch的帖子

迭代std :: vector的最有效方法是什么?为什么?

就时空复杂度而言,以下哪一项是迭代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++ performance iterator stl

40
推荐指数
3
解决办法
3209
查看次数

移位操作数在C++中排序17

我读了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)

c++ sequence-points language-lawyer c++17

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

使用函数对象的C ++线程,如何调用多个析构函数,而不是构造函数?

请在下面找到代码片段:

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)

c++ multithreading destructor

12
推荐指数
2
解决办法
520
查看次数

C编程 - 循环直到用户输入数字scanf

我需要帮助我的程序错误检查.我要求用户输入一个整数,我想检查用户输入是否是整数.如果没有,请重复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 if-statement scanf

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

指针分配和增量如何在下面的示例中工作

我正在学习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)

yz指向变量的下一个整数地址x.我无法理解这条线是如何工作的

*y++=*z++;
Run Code Online (Sandbox Code Playgroud)

有人可以解释一下C如何理解这一行吗?

c pointers

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

uint8_t 到字符串的转换 [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] …

c arrays string pointers uint8t

4
推荐指数
1
解决办法
3万
查看次数

C/C++:是否使用比较结果作为 int 真的无分支?

我在很多 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++ comparison branch-prediction

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

C编程语言中的指针混淆

大家好,新年快乐!

我很难理解C语言中的指针.据我所知,指针是一个存储常规变量地址的特殊变量.

我正在发布两个相同的代码示例.在第一次我输入scanf中&d1.am.

在第二个示例中,如果我更改&d1.amptd1.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!

在此先感谢您的帮助!

c pointers

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

以下C代码的输出使我感到困惑

这是我的代码

#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

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

在 C++ 中,将取消引用的后递增指针分配给另一个取消引用的后递增指针的结果是什么?

我在 c++ 中遇到了与以下类似的代码,但我不确定它到底做了什么。

*x++ = *y++;
Run Code Online (Sandbox Code Playgroud)

xy是对uint32s 的引用。

我知道这++是后增量运算符和*取消引用,但我仍然不确定它到底是做什么的。

c++

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