我学习用C动态内存分配++和关键字new和new[]被提及.据说,用户可以在运行时指定内存分配的大小,而不像在源代码中声明一个具有固定大小的变量或数组.
我不明白这个概念.它是如何工作的?我只需要澄清这个想法,一个例子会有所帮助!
c++ malloc memory-management new-operator dynamic-allocation
我正在学习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)
感谢您阅读,评论和帮助!
很抱歉这个浮夸的名字,我想创建一个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?),这个应该是可行的.
我刚刚开始使用 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.
如何检索我昨天创建的分支?
我提出了下面这段代码,认为它不起作用,但令我惊讶的是它的工作绝对正常,我想要一些解释.
#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 …
是否有可能重新映射,它使用的是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格式存储.我问的是 …
据我所知,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在这种情况下是不安全的.
抱歉,我不知道如何找到这个问题的好标题,随时编辑.
我有一系列具有相同角色的类,这意味着它们都实现了相同的接口(方法集).考虑它们都从相同的抽象类继承(即使在最小的例子中不是这种情况;它不是这个问题的重点).这些类都是模板化的.
我想定义一个类抽空模板参数,说T和U,和以前的一个类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++ 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.
提前感谢您阅读本文,我找不到解决问题的答案......我不明白我所做的与我发现的教程/建议不同:
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)