Cuando estoy usando str [] obtengo un error de compilación del tipo de desajuste. Cuando uso str + push_back en lugar de str [] todo funciona bien.

   class Solution {
public:
   string bits(int n){
       string str[32];//size already known thats why used str[32]
        for(long long int i=31;i>=0;i--)
        {
            if(n & 1<<i){
                str[i]=('1');
            }else{
                str[i]=('0');
            }
            
        }
       return str;
    };
    int findMaximumXOR(vector<int>& nums) {
        queue<int>q;
        vector<string>s(nums.size());
        for(int i=0;i<nums.size();i++ ){
           s[i]=bits(nums[i]);
            cout<<s[i]<<"\n";
        }
        return 0;
    }
};
0
Mohammad Anas 30 sep. 2020 a las 04:02

2 respuestas

La mejor respuesta

string str[32]; está declarando una matriz de 32 std::string objetos. Pero se declara que el método bits() devuelve un solo std::string, por lo que return str; no funciona.

No quieres una matriz de 32 cadenas. Quieres una sola cadena de 32 caracteres de longitud, por ejemplo:

std::string bits(int n) {
    std::string str(32, '0');
    for(long long int i = 31; i >= 0; i--) {
        if (n & (1 << i)) {
            str[i] = '1';
        }
    }
    return str;
}

Dicho esto, como @Slava mencionó en los comentarios, si quieres una forma mejor , usa std::bitset en su lugar:

std::string bits(int n) {
    return std::bitset<32>(n).to_string();
}
4
Remy Lebeau 30 sep. 2020 a las 01:25

Si desea una cadena que represente una expresión binaria de 32 bits, necesita una sola cadena. En C ++, [] en una declaración generalmente se refiere a una matriz de algo , como en int x[N] es una matriz de N int valores .

Reelaborado:

  string bits(int n) {
    std::string str(32, '0'); // Reserve with 32 x 0

    for(long long int i=31;i>=0;i--) {
      if(n & 1<<i) {
          str[i]=('1');
      }
    }

    return str;
  };

También hay muchas peculiaridades en este código, que eliminaré aquí:

  // Avoid using namespace std; and embrace the std:: prefix
  std::string bits(int n) {
    string str(32, '0');

    // You do not need a long long int to iterate to 31
    // Also try and express your loops as going from 0..N-1 unless
    // doing so overly complicates the code.
    for (int i=0; i<32; ++i) {
      // Although not necessary, the brackets around (1 << i)
      // make it abundantly clear this is not to be read as
      // something like (n & 1) << i
      if (n & (1 << i)) {
        // The braces around the '1' serve no purpose
        str[i]='1';
      }
    }

    return str;
  };
3
tadman 30 sep. 2020 a las 01:12