C++ STL中有多少种类型的迭代器?截至目前,我知道这些:
还有更多吗?它们之间有什么区别?每个的限制和特征是什么?使用哪种类型?
在C++ IS的C.1.3(2003.它也在C++ 11 IS中),该标准指出了ISO C和C++之间的差异; 即,为
char arr[100];
Run Code Online (Sandbox Code Playgroud)
sizeof(0, arr)以C语言返回sizeof(char*),但100在C++中.
我找不到sizeof两个参数的文档.明显的后备是逗号运算符,但我不这么认为:sizeof(arr)在C中100; sizeof(0, arr)是sizeof(char*).两个sizeof(0, arr)和sizeof(arr)是100在C++中.
在这种情况下,我可能会忽略IS的重点.有人可以帮忙吗?这类似于09年讨论的问题,但没有人提到IS,我认为没有给出正确的答案.
编辑:实际上,IS正在谈论逗号运算符.因此,出于某种原因,在C中(0, arr)返回a char*,但char[100]在C++中返回a .为什么?
我想知道程序员何时使用函数try块.什么时候有用?
void f(int i)
try
{
if ( i < 0 )
throw "less than zero";
std::cout << "greater than zero" << std::endl;
}
catch(const char* e)
{
std::cout << e << std::endl;
}
int main() {
f(1);
f(-1);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:(在ideone处)
greater than zero
less than zero
Run Code Online (Sandbox Code Playgroud)
编辑:因为有些人可能认为函数定义的语法不正确(因为语法看起来不熟悉),我要说它不是不正确的.它叫做function-try-block.参见C++标准中的§8.4/ 1 [dcl.fct.def].
当我打开布局编辑器时,eclipse会给出这个错误:
parseSdkContent failed
Could not initialize class android.graphics.Typeface
Run Code Online (Sandbox Code Playgroud)
当我尝试运行项目时,它会给出这个错误:
An internal error occurred during: "Launching myapp".
java.lang.NullPointerException
Run Code Online (Sandbox Code Playgroud)
每次我收到此错误,我都要重启eclipse.有什么解决方案吗?这个问题今天突然开始.
XML文件:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#66000000"
>
<RelativeLayout
android:id="@+id/refresh_match_layout"
android:layout_width="fill_parent"
android:layout_height="150dp"
android:layout_centerInParent="true"
android:layout_margin="15dp"
android:background="@drawable/app_detay_lay_bg"
android:orientation="vertical"
android:padding="10dp"
android:visibility="visible" >
<ImageView
android:id="@+id/app_icon"
android:layout_width="50dp"
android:layout_height="50dp"
android:padding="10dp"
android:textColor="#ffffff"
android:textSize="20sp" />
<TextView
android:id="@+id/app_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="8dp"
android:textColor="#000000"
android:layout_toRightOf="@+id/app_icon"
android:layout_marginTop="2dp"
android:textSize="20sp" />
<ImageButton
android:id="@+id/app_detail_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true"
android:layout_marginBottom="2dp"
android:background="@null"
android:src="@drawable/settings_detail"/>
<ImageButton
android:id="@+id/app_remove_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/app_icon"
android:layout_alignTop="@+id/app_detail_button"
android:background="@null"
android:src="@drawable/settings_remove" />
</RelativeLayout>
</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)
错误图片:

C++标准本身的大小char,signed char并且unsigned char被定义为1个字节.我想知道它为什么没有定义sizeof(bool)呢?
C++ 03标准$ 5.3.3/1说,
sizeof(char),sizeof(signed char)和sizeof(unsigned char)是1; sizeof应用于任何其他 基本类型(3.9.1)的结果是实现定义的.[注意:特别是sizeof(bool)和sizeof(wchar_t)是实现定义的 .69)
我理解sizeof(bool)不能小于一个字节的基本原理.但有没有理由说它为什么应该大于1个字节呢?我并不是说实现将它定义为大于1,但是标准使它被实现定义为好像它可能大于1.
如果没有理由sizeof(bool)大于1,那么我不明白为什么标准没有1 byte像它定义的那样定义它sizeof(char),而且它是所有变体.
我们可以将数组的引用传递给如下函数:
void f(int (&a)[5]);
int x[5];
f(x); //okay
int y[6];
f(y); //error - type of y is not `int (&)[5]`.
Run Code Online (Sandbox Code Playgroud)
或者甚至更好,我们可以编写一个函数模板:
template<size_t N>
void f(int (&a)[N]); //N is size of the array!
int x[5];
f(x); //okay - N becomes 5
int y[6];
f(y); //okay - N becomes 6
Run Code Online (Sandbox Code Playgroud)
现在我的问题是,如何从函数返回数组的引用?
我想从函数返回以下类型的数组:
int a[N];
int a[M][N];
int (*a)[N];
int (*a)[M][N];
Run Code Online (Sandbox Code Playgroud)
其中,M与N在编译时已知!
从函数传递和返回数组的编译时引用的一般规则是什么?我们如何int (*a)[M][N]将函数数组的引用传递给函数?
编辑:
Adam评论说:int (*a)[N]不是数组,它是指向数组的指针.
是.但是在编译时已知一个维度!我们如何将这个在编译时已知的信息传递给函数?
这是给出段错误的程序.
#include <iostream>
#include <vector>
#include <memory>
int main()
{
std::cout << "Hello World" << std::endl;
std::vector<std::shared_ptr<int>> y {};
std::cout << "Hello World" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
当然,程序本身绝对没有错.segfault的根本原因取决于其构建和运行的环境.
我们在亚马逊上使用构建系统,该系统以几乎与机器无关的方式构建和部署二进制文件(lib和bin).对于我们的情况下,基本上意味着它部署的可执行文件(从上面的程序内置)到和几乎所有的依赖(即共享库)进入.为什么我使用的短语"几乎"是因为共享库,比如,,和可能的其他几个人,从系统(即从可执行选秀权).请注意,这是应该挑选从不过.$project_dir/build/bin/$project_dir/build/lib/libc.solibm.sold-linux-x86-64.so.2/lib64libstdc++$project_dir/build/lib
现在我运行如下:
$ LD_LIBRARY_PATH=$project_dir/build/lib ./build/bin/run
segmentation fault
Run Code Online (Sandbox Code Playgroud)
但是,如果我运行它,而不设置LD_LIBRARY_PATH.它运行正常.
以下是ldd这两种情况的信息(请注意,我编辑了输出,以便在存在差异的地方提及库的完整版本)
$ LD_LIBRARY_PATH=$project_dir/build/lib ldd ./build/bin/run
linux-vdso.so.1 => (0x00007ffce19ca000)
libstdc++.so.6 => $project_dir/build/lib/libstdc++.so.6.0.20 …Run Code Online (Sandbox Code Playgroud) 可能重复:
C++中的Nullable值
在C++中表示可空成员的最佳方法是什么?
在C#中,我们可以使用Nullable<T>类型.非常需要这样的数据类型,因为并非所有数据都具有有意义的价值.这是一个非常重要的数据类型,@ Jon Skeet花了整整一章,跨越了27页,仅Nullable<T>在他的优秀着作C#Depth中进行了描述.
一个简单的例子可以是一个Person类1,定义为:
struct Person
{
std::string Name;
DateTime Birth;
DateTime Death;
//...
};
Run Code Online (Sandbox Code Playgroud)
由于一个人总是有生日,所以Birth上述班级的成员总会有一些有意义的价值.但是怎么样Death?如果这个人还活着,它应该有什么价值呢?在C#中,此成员可以声明为Nullable<DataTime>2,null如果此人活着,则可以将其分配.
在C++中,解决这个问题的最佳方法是什么?截至目前,我只考虑了一个解决方案:将成员声明为指针:
DataTime *Death;
Run Code Online (Sandbox Code Playgroud)
现在它的价值可以是nullptr人活着的时候.但它强迫使用new死人,因为它会有一些有效的价值.它反过来意味着不能依赖编译器生成的默认复制语义代码.程序员必须编写复制构造函数,复制赋值,析构函数遵循三条规则(C++ 03),或者在C++ 11中规则,五条规则.
那么,除了制作指针之外,我们还有更好,更优雅的解决方案吗?
其他示例包括关系数据库表,因为在许多DBMS中,列可以为空.
这也有一个简写.人们可以写DataTime?这正是因为相同Nullable<DateTime>.
我知道临时不能绑定到非const引用,但它可以绑定到const引用.那是,
A & x = A(); //error
const A & y = A(); //ok
Run Code Online (Sandbox Code Playgroud)
我也知道在第二种情况(上图)中,临时创建A()的生命周期延长到const引用的生命周期(即y).
但我的问题是:
可以将绑定到临时的const引用进一步绑定到另一个const引用,将临时的生命周期延长到第二个对象的生命周期吗?
我尝试过这个并没有用.我不太明白这一点.我写了这段代码:
struct A
{
A() { std::cout << " A()" << std::endl; }
~A() { std::cout << "~A()" << std::endl; }
};
struct B
{
const A & a;
B(const A & a) : a(a) { std::cout << " B()" << std::endl; }
~B() { std::cout << "~B()" << std::endl; }
};
int …Run Code Online (Sandbox Code Playgroud)