在exceptional c++的第17项中,我发现:
首先,对于所有容器,多元素插入(“迭代器范围”插入)从来都不是强异常安全的。
但在effective STL的第1项中,我发现:
如果您需要用于多元素插入的事务性语义(例如范围表单--请参阅项目5),则需要选择list,因为list是为多元素插入提供事务性语义的唯一标准容器。
在249 of the c++ standard library 2th页面中,我发现:
对于列表,即使是多元素插入操作也是事务安全的.
所以我的问题是哪一个是对的?强异常安全意味着事务安全吗?
这些天我正在学习STL,我想知道STL容器是否以参考方式返回。
例如:
vector.first();
map[key];
*vector.begin();
Or any possible return that ends with element (or value type) of container
例如:
std::vector<int> elements;
elements.push_back(20);
elements[0]=60; // this will also change the value
elements.front() = 23; // even the
我们创建了三种STL和STL继承数据类型,用于集群算法:
typedef std::vector<double>Point; // A list of parameters (a single observation)
struct Cluster : std::list<Point> { // A list of Points
// Additional member variables
Point centroid;
bool centroid_valid;
bool sort_valid;
// Cluster functi
struct A {
// ... some methods ...
std::vector<int> foo;
// ... more data members ...
};
使用g++4.7和libstdc++,我得到了std::is_standard_layout<A>::value == true。
但是其他编译器或标准库会发生什么呢?
是否有任何保证(至少是肯定的?)STL-containers不会破坏标准布局?
背景:
struct B : A { // still standard-layout
// ... more method
我对使用来自多个线程的对象表示怀疑。
首先,保护对象免受std::lock_guard或其他对象的同时访问是没有问题的。
下一步是声明具有易失性的对象。
class A
{
public: int val;
};
volatile A a;
但这样做的结果是有许多新函数的类型限定符volatile .int GetVal()易失性;空SetVal()易失性;
好的,这一切都很好。
但是如何访问stl成员,例如std::vector或std::map.
如果我想要一个易失性的std::vector<int>,我会在很多错误中运行,而stl不定义任何易失性方法。
从这一点开始,
我正在迭代一个STL向量,并从中读取值。还有另一个线程可以对这个向量进行更改。现在,如果另一个线程在向量中插入或删除了和元素,则会使迭代器失效。没有涉及到锁的使用。我选择通过索引(方法1)而不是迭代器(方法2)访问容器是否使其线程安全?性能如何?
struct A{int i; int j;};
方法1:
size_t s = v.size();//v contains pointers to objects of type A
for(size_t i = 0; i < s; ++i)
{
A* ptr = v[i];
ptr-