要明白:以下是否安全?
vector<int> v;
int const* last = &*v.end();
// last is never dereferenced
我担心的是从迭代器获取一个普通旧指针的技巧强制取消引用end()迭代器,这是无效的......即使只是把指针拿回来了!
Backgroud :我正在尝试创建一个由任意类型索引的条目集合(尤其是整数和指向对象的指针)。
template<class IT>
/// requires IT implements addition (e.g. int, random-access iterator)
class IndexingFamily {
public:
using IndexType = IT;
IndexingFamily(IndexType first, IndexType last);
int size() const;
IndexType operator[](int i) const;
private:
IndexType first;
IndexType last;
};
template<class IT> IndexingFamily<IT>::
IndexingFamily(IndexType first, IndexType last)
: first(first)
, last(last) {}
template<class IT> auto IndexingFamily<IT>::
size() const -> int {
return last-first;
}
template<class IT> auto IndexingFamily<IT>::
operator[](int i) const -> IndexType {
return first+i;
}
template<class IT, class ET>
struct IndexedEntry {
using IndexType = IT;
using EntryType = ET;
IndexType index;
EntryType entry;
};
template<class IT, class ET>
class CollectionOfEntries {
public:
using IndexType = IT;
using EntryType = ET;
/// useful methods
private:
IndexingFamilyType indexingFamily;
vector<EntryType> entries;
};
struct MyArbitraryType {};
int main() {
MyArbitraryType obj0, obj1, obj2;
vector<MyArbitraryType> v = {obj0,obj1,obj2};
using IndexType = MyArbitraryType const*;
IndexingFamily<IndexType> indexingFamily(&*v.begin(),&*v.end());
using EntryType = double;
using IndexedEntryType = IndexedEntry<IndexType,EntryType>;
IndexedEntry entry0 = {&obj0,42.};
IndexedEntry entry1 = {&obj1,43.};
vector<IndexedEntryType> entries = {entry0,entry1};
CollectionOfEntries coll = {indexingFamily,entries};
return 0;
}
答案 0 :(得分:2)
取消引用<Resource ....
迭代器会给出任何标准容器的未定义行为。
对于向量,您可以使用
获取与end()
迭代器对应的指针
end()
或
pointer_to_end = v.empty() ? 0 : (&(*v.begin()) + v.size());
如果pointer_to_end = v.data() + v.size(); // v.data() gives null is size is zero
为空v.empty()
,则需要检查v
。对于C ++ 11或更高版本,在上面使用v.begin() == v.end()
代替nullptr
通常被认为是更可取的。
答案 1 :(得分:1)
成员函数<iosfwd>
返回的迭代器&#34;点&#34;在向量的最后一个元素之后。你可能不会取消引用它。否则程序将具有未定义的行为。
您可以通过以下方式获取相应的指针
plot_ly(
x = as.vector(de$MO),
y = de$CNT,
text = a, hoverinfo = "text", mode="y", type = "bar",
name = "SF Zo",
color = as.character(de$MO)
)%>%
add_trace(data=de, x=as.vector(de$MO), y=de$CNT, mode="text",text=a, hoverinfo='none',textposition = "top middle", showlegend = FALSE)%>%
layout(title= paste("Monthly SOI Count of", clientName,"for the year",selectedYear, sep = " ") , xaxis = xQuartAxis, yaxis = yQuartAxis)
如果要使用成员函数end()返回的迭代器,可以编写
end()
考虑到成员函数data()返回向量数据占用的内存范围的原始指针。