我有一个正常的迭代器到双向数据结构中的位置(实际上是向量).现在我想对当前位置的过去x元素执行操作.之前总会有至少x个元素,尽管最后的x可能是向量的第一个元素.
我写了这段代码
vector<Record>::iterator it = itCurrentRecord;
for (unsigned int i = 0; i < length; i++)
{
(it--)->length = length;
}
Run Code Online (Sandbox Code Playgroud)
这样安全吗?我担心当它指向第一个元素时,最终的减量将导致迭代器在第一个元素之前指向一个元素,这是无效的.
如果是这样,我怎样才能以安全的方式重写它?
谢谢
我有一个std :: map,键和值都是整数.现在我想随机地改变地图,所以键随机指向不同的值.我尝试了random_shuffle但它没有编译.请注意,我并没有试图改变键,这对于地图来说没有意义.我试图随机化这些值.
我可以将值推送到一个向量中,然后将其复制然后复制回来.有没有更好的办法?
假设我有.. int,int*,int**等.我可以使用std :: remove_pointer或类似的直接输入int吗?谢谢
对于一个项目,我必须使用C风格的文件类型进行读/写.它可以是常规FILE,也可以是gzfile的C版本等.我仍然喜欢使用C++流的方便性.是否有一个流类在内部重定向到C风格的文件操作?所以myfile << hex << myint
最终成为fprintf("%a", myint)
或类似的东西?
如果我有头文件
namespace Bob
{
extern const T x;
};
Run Code Online (Sandbox Code Playgroud)
并在源文件中
extern const T Bob::x = 123;
Run Code Online (Sandbox Code Playgroud)
extern
源文件中的第二个是必需的还是可选的?
我搜索过并发现了相互矛盾的信息.
从这个网页:http: //msdn.microsoft.com/en-us/library/357syhfh.aspx
但是要在C++中获得相同的行为,必须将const变量[在源文件中]声明为:
extern const int i = 2;
Run Code Online (Sandbox Code Playgroud) 我已经知道如何使用new
并使用它来创建动态2D矩阵delete
.由于C++ 11在这里与许多新的存储器功能,例如unique_ptr
,array
容器等; 什么是创建2D矩阵的好方法,以便人们不需要使用delete
运算符显式释放矩阵?
我有一个管理资源的课程.它需要一个可以从路径中检索资源的Loader类.Loader是一个抽象基类,所以任何人都可以创建一个新的加载器.
如果请求的资源不在缓存中,资源管理器将从加载器请求它.如果加载器失败,资源管理器会抛出一个名为LoadingError的异常类.
我希望Loader类在失败时抛出异常.如有必要,我可以要求他们从我自己的异常基类继承.
问题是,当抛出LoadingError时,我希望它包含有关失败原因的具体信息.但我不确切知道Loader会抛出什么异常.(用户可能会在资源管理器周围的catch块中).
我可以只使用一些常规信息抛出LoadingError,或者允许Loader中的特定异常出来而不触摸它.但我想捕获异常并将其捆绑在我自己的LoadingError异常中,或者在LoadingError中指向它.但我不知道指向异常将持续多长时间(关注坏指针).
我应该做哪三个?(以及如何,对于第三个..)
谢谢
我有一个T&具有const和非const版本的函数.我想调用函数的const版本.我尝试使用std :: add_const将T&转换为const T&但它不起作用.我做错了什么,我该如何解决?
这是一个简单的例子.
void f(int&)
{
std::cout << "int&" << std::endl;
}
void f(const int&)
{
std::cout << "const int&" << std::endl;
}
int main()
{
int a = 0;
int& r = a;
f(static_cast<std::add_const<decltype (r)>::type>(r));
}
Run Code Online (Sandbox Code Playgroud)
输出: int&
最近我读到如果传递的仿函数是有状态的(有内部副作用),一些STL算法有不确定的行为.我已经将std::generate
函数与类似(不太重要)的仿函数一起用于以下内容:
class Gen
{
public:
explicit Gen(int start = 0)
: next(start)
{
}
int operator() ()
{
return next++;
}
private:
int next;
};
Run Code Online (Sandbox Code Playgroud)
这可以安全使用std::generate
吗?生成值的顺序是否有保证?
编辑:声明在这里有状态的仿函数和STL:未定义的行为
以下代码将无法在我的编译器上编译.我理解为什么.
void f(signed char x);
void f(unsigned char x);
int main()
{
char c = 0;
f(c);
}
Run Code Online (Sandbox Code Playgroud)
signed char
,unsigned char
并且char
是三种不同的类型,这导致重载模糊.
我的问题是,这总是保证是模糊的,因此编译错误?是否有一些规则可选择允许编译器接受此代码?是否存在一些异常但合法的整数大小组合会导致此代码编译?