AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / 问题

All perguntas(coding)

Martin Hope
Qwe Qwe
Asked: 2025-04-19 21:21:02 +0800 CST

Criando uma função utilitária de string única com comportamento duplo em C++

  • 10

Estou desenvolvendo uma classe utilitária de strings que fornece diversas funções de manipulação de strings. Quero que os usuários tenham duas opções ao usar essas funções:

  • Crie e retorne uma nova string com a manipulação aplicada
  • Atualizar a sequência de caracteres existente no local

Atualmente, implementei isso com sobrecarga de função:

struct String final {
    static std::string toUpperCase(const std::string& str) {
        std::string result = str;
        std::transform(result.begin(), result.end(), result.begin(), 
                       [](unsigned char c) { return std::toupper(c); });
        return result;
    }
    
    static void toUpperCase(std::string& str) {
        std::transform(str.begin(), str.end(), str.begin(), 
                       [](unsigned char c) { return std::toupper(c); });
    }
};

int main() {
std::string str {"helloworld"};
std::string test = String::toUpperCase(str);
String::toUpperCase(str);
}

Minha pergunta: É possível combinar essas duas funções em uma única função que pode:

-> Retorna uma nova string maiúscula quando necessário
-> Modifique uma string no local quando desejado

Qual seria a abordagem C++ mais elegante e idiomática para isso? Considerei modelos e parâmetros opcionais, mas não tenho certeza de qual abordagem forneceria a API mais limpa para os usuários.

Se não for possível combinar essas duas funções em uma única função, também estou interessado em saber como eliminar a std::transform...duplicação de code( ) entre elas.

Observação: Estou ciente de que a implementação que mostrei não compilaria. Estou compartilhando-a especificamente para ilustrar a abordagem que eu estava considerando e os desafios que estou enfrentando com sobrecarga de funções e especialização de modelos.

c++
  • 1 respostas
  • 144 Views
Martin Hope
sentientbottleofwine
Asked: 2025-04-15 22:33:37 +0800 CST

Converte argumentos de modelo de uma função em tipos exatos aceitos por uma determinada definição de tipo de uma função

  • 10

Dada uma definição de tipo de uma função, existe uma maneira de converter os parâmetros recebidos por meio de um modelo variádico como um argumento para os tipos exatos da typedeffunção ed?

#include <concepts>
#include <iostream>

typedef int foo(int, int);

template <typename func, typename... Args>
  requires std::invocable<func, Args &&...>
void bar(Args&&... args) {
  ((std::cout << std::forward<Args>(args)), ...);
}

int main() { bar<foo>(4, 4.1); }

Neste exemplo, verifico se funcwould seria invocável com os argumentos fornecidos e, em seguida, imprimo os argumentos passados. 4 e 4.1 são impressos (como esperado). Mas fooaceita int,int, então o objetivo seria imprimir 4 e 4 como resultado da conversão argspara os tipos de parâmetros aceitos por foo. Uma solução simples, porém funcional, seria muito apreciada.

c++
  • 1 respostas
  • 95 Views
Martin Hope
Gregorio Litenstein
Asked: 2025-04-15 21:56:51 +0800 CST

Existe uma maneira de fazer cast ao passar argumentos para uma função que deseja um ponteiro?

  • 10

Considere o seguinte cenário (comum) ao lidar com, por exemplo, OpenGL:

Você tem void glUseProgram(GLuint program);, assim como uma série de outras funções que exigem GLuint; mas não há glGetUint, você está preso a glGetInteger.

Então, digamos que você tem

class Foo() {
public:
    Foo::Foo() {
        glGetIntegerv(GL_CURRENT_PROGRAM, &program);
    }

private:
    GLuint program;
    void Bar();
};

Por literalmente mais de 10 anos em nosso projeto, tivemos um trecho de código semelhante e somente agora, sem realmente alterar a configuração, o compilador começou a reclamar sobre esta conversão específica:

error: implicit conversion changes signedness: 'GLint' (aka 'int') to 'GLuint' (aka 'unsigned int') [-Werror,-Wsign-conversion] 

A solução é obviamente simples:

class Foo() {
public:
    Foo::Foo() {
        int _program;
        glGetIntegerv(GL_CURRENT_PROGRAM, &_program);
        program = static_cast<GLuint>(_program);
    }

private:
    GLuint program;
    void Bar();
};

Mas a questão é: posso fazer a mesma coisa em apenas uma etapa, sem precisar usar um int de escopo local no meio?

c++
  • 2 respostas
  • 198 Views
Martin Hope
Dominik Kaszewski
Asked: 2025-04-11 16:40:24 +0800 CST

Por que as visualizações de intervalo encadeadas às vezes aumentam de tamanho?

  • 10

Tenho experimentado std::ranges::viewse notado que cada visualização encadeada fica maior. Para iteradores de visualização, esse padrão é simples: cada um é sempre 8 bytes maior que o anterior. Mas para as visualizações em si, o transformtamanho não aumenta em nada, mas filteraumenta em uma quantidade que não consigo entender. No MSVC, esse padrão é um pouco diferente, mas ainda imprevisível para mim.

Código de teste:

#include <iostream>
#include <ranges>
#include <string>

int main() {
    static constexpr auto printed = [](auto&& v) {
        std::cout << "sizeof(v): " << sizeof(v) << ", ";
        std::cout << "sizeof(it): " << sizeof(v.begin()) << ", ";
        std::cout << "values: { ";
        for (auto&& x : v) {
            std::cout << x << ", ";
        }
        std::cout << "}\n";
        return v;
    };

    using namespace std::ranges::views;
    auto hundred = printed(iota(0ull, 100ull));
    auto small = printed(hundred | filter([](auto i) { return i < 50; }));
    auto times_seven = printed(small | transform([](auto i) { return i * 7; }));
    auto even = printed(times_seven | filter([](auto i) { return i % 2 == 0; }));
    auto as_string = printed(even | transform([](auto i) { return std::to_string(i); }));
    auto no_twos = printed(as_string | filter([](auto s) { return s.find('2') == s.npos; }));
}

Execute-o no GodBolt

Resultados:

visualizar tamanho(dele) delta sizeof(visualização), GCC/Clang delta sizeof(visualização), MSVC delta
iota 8 16 16
filtro 16 8 32 16 48 32
transformar 24 8 32 0 64 16
filtro 32 8 64 32 112 48
transformar 40 8 64 0 128 16
filtro 48 8 112 48 192 64

Meu código não se importa muito com o tamanho das visualizações, já que elas nunca são armazenadas em lugar nenhum. Só estou me perguntando por que elas não podem ser constantes, dependendo apenas do tamanho do lambda (aqui sempre vazio). Tentei analisar o código-fonte, mas acho muito difícil de ler com todas as camadas de classes base, especialização de modelos e restrições de conceitos.

c++
  • 1 respostas
  • 107 Views
Martin Hope
JJL
Asked: 2025-04-11 04:47:58 +0800 CST

Dividir números de versão para encontrar a versão mais recente [duplicado]

  • 10
Esta pergunta já tem respostas aqui :
Classificação de vetores de caracteres contendo versões semânticas (5 respostas)
Fechado há 4 horas .

Estou trabalhando com números de versão e preciso obter a versão mais recente. Neste caso, é 1.11.3. Tenho uma solução funcional, mas espero que haja uma maneira mais elegante de fazer isso em R. Aqui está minha solução atual com um pequeno conjunto de dados. Alguém tem uma maneira melhor de fazer isso? De preferência, algo apenas com funções básicas.

test <- c("0.6.0", "1.0.3", "1.6.7", "1.8.0", "1.5.4", "1.10.0", "1.2.0", "1.11.3", "1.9.4")
split_test <- do.call(rbind, strsplit(test, ".", fixed=TRUE))
split_test <- matrix(as.numeric(split_test), ncol = ncol(split_test))
paste(split_test[order(-split_test[,1], -split_test[,2], -split_test[,3])[1],], collapse=".")
  • 1 respostas
  • 59 Views
Martin Hope
Yanni Wang
Asked: 2025-04-10 23:57:33 +0800 CST

Por que &Range<T> não é um iterador, mas &mut Range<T> é?

  • 10

Código de demonstração usando a versãorustc 1.86.0 (05f9846f8 2025-03-31)

fn main() {
    let mut source = 1..3;

    test(&mut source); // This is good. which means &mut Range<T> is Iterator. 

    test(&source); // This code error "`&std::ops::Range<{integer}>` is not an iterator"
}

fn test(i: impl Iterator<Item = i32>) {
    for i in i {
        println!("{}", i);
    }
}

Não encontrei o motivo da ferrugem no código fonte.

rust
  • 2 respostas
  • 51 Views
Martin Hope
rad
Asked: 2025-04-10 06:31:13 +0800 CST

Aquisição/liberação atômica em C++ e RMW - é possível adquirir sincronização de carga com vários RMWs de liberação?

  • 10

As threads A, B e C realizam trabalhos separados (não é necessária sincronização entre elas). Assim que as três forem concluídas, a thread D combinará seus resultados. Portanto, D depende da conclusão de A, B e C.

int a = 0;
int b = 0;
int c = 0;
std::atomic_int D_dependencies{ 3 };

linha A:

a = 1;
D_dependencies.fetch_sub(1, std::memory_order_release);

linha B:

b = 1;
D_dependencies.fetch_sub(1, std::memory_order_release);

linha C:

c = 1;
D_dependencies.fetch_sub(1, std::memory_order_release);

linha D:

if(D_dependencies.load(std::memory_order_acquire) == 0)
{
    assert(a + b + c == 3);
}

Meu entendimento é que as operações RMW fetch_subformam uma "sequência de liberação" e, portanto, o carregamento na thread D deve observar todas as gravações se carregar 0 da variável atômica.
Estou correto?

c++
  • 2 respostas
  • 87 Views
Martin Hope
Phoebe
Asked: 2025-04-09 00:45:31 +0800 CST

Como deslistar uma lista de listas e fornecer duas saídas em R

  • 10

Eu tenho uma lista de listas chamada mylist. No exemplo a seguir, mylist tem duas listas, cada uma contendo outras duas listas de números aleatórios.

mylist <- list()
list1 <- rnorm(100)
list2 <- rnorm(100)
list3 <- rnorm(100)
list4 <- rnorm(100)

mylist[[1]] <- list("list1" = list1, "list2" = list2)
mylist[[2]] <- list("list1" = list3, "list2" = list4)  

Ao imprimir o mylist, ele deve nos dar algo como

[[1]]
[[1]]$list1
  [1]  0.0382233645  0.2416676908  1.1910173996  0.7833025597 -0.7144370041
  [6]  1.9762077872  0.9438593806  0.1590264664 -0.5323112247  1.2820246358...
[[1]]$list2
  [1] -0.084982839 -0.462448106  0.771458598  1.354049503 -1.616381590 -0.368789648
  [7] -0.678521566 -0.340799431 -0.441370037 -0.212117105 -0.921661840  0.893550382...
[[2]]
[[2]]$list1
  [1]  0.367971534  0.028976364  1.391761655 -0.033661646  1.196138270 -1.645738949
  [7]  0.086037770  0.530143788  0.639389906  2.193683933 -1.427285285  0.430282258...
[[2]]$list2
  [1]  0.235027959  2.110340896 -0.951831561 -1.510063739 -0.007402732 -0.575736079
  [7] -0.363731268  1.232404358 -0.848716435  1.217101680 -0.014577878  0.440142686...

Quero remover a listagem de mylist para que os resultados finais (res) produzam dois elementos. O primeiro elemento combinará todos os elementos disponíveis da lista1 e o segundo agregará todos os elementos disponíveis da lista2. Os resultados finais devem ser semelhantes a

res$list1
[1]  0.0382233645  0.2416676908  1.1910173996  0.7833025597 -0.7144370041
[6]  1.9762077872  0.9438593806  0.1590264664 -0.5323112247  1.2820246358...
[101]  0.367971534  0.028976364  1.391761655 -0.033661646  1.196138270 -1.645738949
[107]  0.086037770  0.530143788  0.639389906  2.193683933 -1.427285285  0.430282258...

res$list2
[1]  0.367971534  0.028976364  1.391761655 -0.033661646  1.196138270 -1.645738949
[7]  0.086037770  0.530143788  0.639389906  2.193683933 -1.427285285  0.430282258...
[101]  0.235027959  2.110340896 -0.951831561 -1.510063739 -0.007402732 -0.575736079
[107] -0.363731268  1.232404358 -0.848716435  1.217101680 -0.014577878  0.440142686...

Qual é a maneira correta de fazer isso em R? Obrigado!

  • 4 respostas
  • 91 Views
Martin Hope
David
Asked: 2025-04-08 03:02:29 +0800 CST

Algoritmo para detectar loop completo ao iterar sobre uma lista

  • 10

Atribuição:

Escreva uma função cycle_sublist(lst, start, step)onde:

  • lsté uma lista
  • starté um número que satisfaz:0 <= start < len(lst)
  • stepé a quantidade que aumentamos seu índice a cada iteração

sem usar : fatiamento, importação, compreensão de lista, funções integradas como mape filter.

A função funciona da seguinte maneira: começamos a iterar sobre a lista de itens quando voltamos ao início ou a cruzamos novamente. Por exemplo:

cycle_sublist([1], 0, 2) -> [1]
cycle_sublist([6, 5, 4, 3], 0, 2) -> [6, 4]
cycle_sublist([7, 6, 5, 4, 3], 3, 1) -> [4, 3, 7, 6, 5]
cycle_sublist([4, 3, 2, 5, 1, 6, 9], 2, 2) -> [2, 1, 9, 3]
cycle_sublist([4, 3, 2, 5, 1, 6, 9], 5, 3) -> [6, 3, 1]

Meu problema é detectar quando completei um ciclo. Tentei:

  • Verifique meu passo anterior e os passos atuais e compare-os com o início. O problema é que há alguns casos em que falha.
  • Contando meus passos e verificando se já havia cruzado o início.

Nenhuma delas funcionou.

Aqui está meu código - com a lógica faltante para detectar o ciclo:

def cycle_sublist(lst,start,step):
    index = start 
    length = len(last)

    cycle_complete = False
    res = []

    while True:
        index = index % length if index >= length else index

        if ...:
            cycle_complete = True

        if cycle_complete and index >= start:
            break

        res.append(lst[index])

        index += step

    return res

Se possível, gostaria que você respondesse com o algoritmo para detectar o ciclo somente para que eu mesmo possa escrever o código.

python
  • 3 respostas
  • 129 Views
Martin Hope
Ricardo Peres
Asked: 2025-04-07 20:11:39 +0800 CST

.NET V7 Guids não sequenciais

  • 10

Pensei que, por especificação, os Guids do .NET v7 seriam gerados sequencialmente, o que significa:

var guid1 = Guid.CreateVersion7();
var guid2 = Guid.CreateVersion7();
var isGreater = guid2.CompareTo(guid1);

No entanto, para minha surpresa, não é esse o caso — às vezes, o segundo gerado Guidé "maior" que o primeiro, e às vezes o contrário. É assim que eles deveriam funcionar?

c#
  • 1 respostas
  • 85 Views
Prev
Próximo

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Reformatar números, inserindo separadores em posições fixas

    • 6 respostas
  • Marko Smith

    Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não?

    • 2 respostas
  • Marko Smith

    Problema com extensão desinstalada automaticamente do VScode (tema Material)

    • 2 respostas
  • Marko Smith

    Vue 3: Erro na criação "Identificador esperado, mas encontrado 'import'" [duplicado]

    • 1 respostas
  • Marko Smith

    Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores?

    • 1 respostas
  • Marko Smith

    Como faço para corrigir um erro MODULE_NOT_FOUND para um módulo que não importei manualmente?

    • 6 respostas
  • Marko Smith

    `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso?

    • 3 respostas
  • Marko Smith

    Um programa vazio que não faz nada em C++ precisa de um heap de 204 KB, mas não em C

    • 1 respostas
  • Marko Smith

    PowerBI atualmente quebrado com BigQuery: problema de driver Simba com atualização do Windows

    • 2 respostas
  • Marko Smith

    AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos

    • 1 respostas
  • Martin Hope
    Fantastic Mr Fox Somente o tipo copiável não é aceito na implementação std::vector do MSVC 2025-04-23 06:40:49 +0800 CST
  • Martin Hope
    Howard Hinnant Encontre o próximo dia da semana usando o cronógrafo 2025-04-21 08:30:25 +0800 CST
  • Martin Hope
    Fedor O inicializador de membro do construtor pode incluir a inicialização de outro membro? 2025-04-15 01:01:44 +0800 CST
  • Martin Hope
    Petr Filipský Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não? 2025-03-23 21:39:40 +0800 CST
  • Martin Hope
    Catskul O C++20 mudou para permitir a conversão de `type(&)[N]` de matriz de limites conhecidos para `type(&)[]` de matriz de limites desconhecidos? 2025-03-04 06:57:53 +0800 CST
  • Martin Hope
    Stefan Pochmann Como/por que {2,3,10} e {x,3,10} com x=2 são ordenados de forma diferente? 2025-01-13 23:24:07 +0800 CST
  • Martin Hope
    Chad Feller O ponto e vírgula agora é opcional em condicionais bash com [[ .. ]] na versão 5.2? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench Por que um traço duplo (--) faz com que esta cláusula MariaDB seja avaliada como verdadeira? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng Por que `dict(id=1, **{'id': 2})` às vezes gera `KeyError: 'id'` em vez de um TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos 2024-03-20 03:12:31 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve