小编She*_*ohn的帖子

什么是C++中的动态内存分配?

我学习用C动态内存分配++和关键字newnew[]被提及.据说,用户可以在运行时指定内存分配的大小,而不像在源代码中声明一个具有固定大小的变量或数组.

我不明白这个概念.它是如何工作的?我只需要澄清这个想法,一个例子会有所帮助!

c++ malloc memory-management new-operator dynamic-allocation

4
推荐指数
2
解决办法
3788
查看次数

数组在C++中自动填充

我正在学习C++,做一些简单的例子,并发现了这种奇怪的行为.当填充整数数组的元素时,如果任何元素设置为大于2147483647(我认为是最大整数值?),则数组中的其余元素将设置为该确切数字,每个其中之一.

我理解如果一个元素超出其类型限制,编译器会将其限制为该限制,但我无法理解为什么它与其他项目做同样的事情,甚至没有要求用户填充它们.

这是我运行的一个简单测试:

#include <iostream>
using namespace std;

int main()
{
    int test[5];
    int num = 0;

    for (int i=0; i<5; i++)
    {
        cout << "Enter the number in position " << i << endl;
        cin >> num;
        test[i] = num;
    }

    cout << "Values in the array: " <<endl;
    for (int i=0; i<5; i++)
        cout << test[i] << endl;

}
Run Code Online (Sandbox Code Playgroud)

感谢您阅读,评论和帮助!

c++ arrays integer-overflow cin

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

Variadic constexpr类型选择器

很抱歉这个浮夸的名字,我想创建一个constexpr函数,它接受可变数量的布尔模板参数,并返回第一个true值的"模板索引" ,在C++ 11中(C++ 14只有解决方案欢迎但是将不被接受为答案).

例如,调用此函数 Selector

Selector< false, false >() == 0 // none of the template argument is true
Selector< true, false, true >() == 1 // first true template argument is the first one
Selector< false, false, true, false >() == 3 // .. and here it's the third one
Run Code Online (Sandbox Code Playgroud)

这个的典型用法,以及我称之为"类型选择器"的原因是

Selector< std::is_pointer<T>::value, std::is_arithmetic<T>::value >()
Run Code Online (Sandbox Code Playgroud)

我之所以喜欢它是一个constexpr用于部分模板专业化的原因.

我不确定如何解决这个问题,虽然我认为使用可变参数模板,constexpr模板特化(对于0情况)和递归(是否可以"使用"模板参数,比如shiftbash?),这个应该是可行的.

c++ variadic-templates constexpr c++11

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

意外地使用现有名称创建了新分支

我刚刚开始使用 git 分支,昨天我创建了一个分支foo并将其推送到远程。今天我想在家工作,所以在运行了一次 pull 后,我不假思索地打字了git checkout -b foo

我知道我不应该添加该-b选项,因为我收到一条消息Switched to a new branch 'foo',并且我昨天编写的代码都没有出现在我的文件夹中,所以我想我不小心弄乱了分支名称。

我尝试重命名分支,git branch -m foo bar希望它仅处理本地分支并删除重复的分支名称,但可惜git checkout foo发出了消息error: pathspec 'foo' did not match any file(s) known to git.

如何检索我昨天创建的分支?

git version-control branch duplicates

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

L值引用抽象类和`decltype`

我提出了下面这段代码,认为它不起作用,但令我惊讶的是它的工作绝对正常,我想要一些解释.

#include <cstdio>
#include <algorithm>

struct Abstract
{
    Abstract()
        { printf("\tConstructing Abstract instance.\n"); }

    virtual const char* name() const =0;
    auto talk() const -> decltype(*this)
    {
        printf("My name is %s.\n",name());
        return *this;
    }
};

struct Concrete
    : public Abstract
{
    Concrete() 
        { printf("\tConstructing Concrete instance.\n"); }
    const char* name() const
        { return "Bond"; }
};

int main()
{
    Concrete C;
    printf("James %s.\n",C.talk().name());
}
Run Code Online (Sandbox Code Playgroud)

此代码的输出是:

    Constructing Abstract instance.
    Constructing Concrete instance.
My name is Bond.
James Bond.
Run Code Online (Sandbox Code Playgroud)

Q1 (这是非特异性的,以C++ 11,只是删除decltype …

c++ abstract-class decltype c++11

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

手动将HSV重新映射到JET色彩映射

是否有可能重新映射,它使用的是HSV RGB图像(RxCx3)颜色表(未格式化!)使用气流颜色表的RGB图像?换句话说,Matlab中的HSV和JET色图之间是否存在"映射"?

我没有想过这么难,但这是一个快速而肮脏的尝试:

function J = remap( I )

    n = 256;
    X = hsv(n);
    Y = jet(n);
    t = linspace(0,1,n)';

    [r,c,~] = size(I);
    I = reshape( I, r*c, 3 );
    u = interp3( X(:,1), X(:,2), X(:,3), t, I(:,1), I(:,2), I(:,3) );

    J = I;
    for k = 1:3
        J(:,k) = interp1( t, Y(:,k), u );
    end
    J = reshape( J, r, c, 3 );

end
Run Code Online (Sandbox Code Playgroud)

不幸的是,这会interp3在行上引发错误,称" 网格向量必须包含唯一的点 ".我不确定我的代码是正确的做法(我基本上试图将一维嵌入坐标适合HSV色图),但是这size(unique(hsv(256),'rows'),1)==256是真的所以我不太清楚为什么会出现这个错误.

注意:它可能会让一些人感到困惑,但这个问题与HSV格式无关 ; 这里的所有彩色图像都以RGB格式存储.我问的是 …

mapping matlab colormap

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

memmove vs向后复制

据我所知,memmove在C(cstring库)中处理很好地" 以较慢的运行时为代价 "(参见这篇文章).我想知道为什么这个额外的运行时成本?在我看来,任何重叠问题都可以通过向后复制而不是向前复制来解决,我错了吗?

作为一个玩具示例,这里有两个版本的"右移"函数,它将数组的内容移动右侧的一个元素:

// Using memmove
template <typename T>
void shift_right( T *data, unsigned n )
{
    if (n)
    {
        data[n-1].~T();
        memmove( data+1, data, (n-1)*sizeof(T) );
        new (data) T();
    }
}

// Using copy_backward
template <typename Iterator>
void shift_right( Iterator first, Iterator last )
{
    Iterator it = last;
    std::copy_backward( first, --it, last );
}
Run Code Online (Sandbox Code Playgroud)

它们是等价的吗?性能方面,哪一个最好用?


注意:根据@DieterLücking的评论判断,尽管采取了预防措施,上述版本的使用memmove在这种情况下是不安全的.

c c++ copy memmove

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

模板类需要模板参数吗?

抱歉,我不知道如何找到这个问题的好标题,随时编辑.

我有一系列具有相同角色的类,这意味着它们都实现了相同的接口(方法集).考虑它们都从相同的抽象类继承(即使在最小的例子中不是这种情况;它不是这个问题的重点).这些类都是模板化的.

我想定义一个类抽空模板参数,说TU,和以前的一个类A 无模板参数.在内部,这个新类将使用A<T>A<U>.这可能吗?欢迎使用C++ 11答案,如有必要,可随意添加标签.

失败的例子在这里:

#include <iostream>

// ------------------------------------------------------------------------

struct eng_tag {};
struct fr_tag {};
struct sp_tag {};

// First implementation of the "talk interface"
template <class T = eng_tag> struct A
{
    void talk() { std::cout<<"Hello\n"; }
};
template <> struct A<fr_tag>
{
    void talk() { std::cout<<"Salut\n"; }
};
template <> struct A<sp_tag>
{
    void talk() { std::cout<<"Ola\n"; }
};

// Second implementations
template <class T …
Run Code Online (Sandbox Code Playgroud)

c++ templates

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

没有可行的从std :: function到bool的转换

C++ 11 std::function应该实现operator bool() const,为什么clang告诉我没有可行的转换?

#include <functional>
#include <cstdio>

inline double the_answer() 
    { return 42.0; }

int main()
{
    std::function<double()> f;

    bool yes = (f = the_answer);

    if (yes) printf("The answer is %.2f\n",f());
}
Run Code Online (Sandbox Code Playgroud)

编译错误是:

function_bool.cpp:12:7: error: no viable conversion from 'std::function<double ()>' to 'bool'
        bool yes = (f = the_answer);
             ^     ~~~~~~~~~~~~~~~~
1 error generated.
Run Code Online (Sandbox Code Playgroud)

编辑我没有看到explicit关键字..没有隐式转换然后,我想我将不得不使用static_cast.

c++ operator-overloading implicit-conversion c++11

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

PHP PDO :: lastInsertId()返回0

提前感谢您阅读本文,我找不到解决问题的答案......我不明白我所做的与我发现的教程/建议不同:

SQL表

CREATE TABLE IF NOT EXISTS `LastInsertID` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` char(150) NOT NULL,
  `email` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=6 ;
Run Code Online (Sandbox Code Playgroud)

PHP文件

<?php

// Connect to database
$user = "foo";
$pswd = "bar";

$db = new PDO( 'mysql:host=localhost;dbname=test', $user, $pswd );
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

// Prepare request
$rq = $db->prepare('INSERT INTO `LastInsertID` VALUES(NULL,:name,:email)');

// Begin and commit request
$db->beginTransaction();
$values = array('name'=>'Foo','email'=>'bar@baz.com');
$rq->execute($values);
$db->commit();

// Echo last ID
echo $db->lastInsertId();

?> …
Run Code Online (Sandbox Code Playgroud)

php mysql pdo

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