我知道@Override
public View getView(int position, View convertView, ViewGroup parent) {
MyViewHolder mViewHolder;
if (convertView == null) {
convertView = inflater.inflate(R.layout.layout_country_list_item, parent, false);
mViewHolder = new MyViewHolder(convertView);
convertView.setTag(mViewHolder);
} else {
mViewHolder = (MyViewHolder) convertView.getTag();
}
ListData countryListData = getItem(position);
mViewHolder.tvCountryName.setText(countryListData.getCountryName());
mViewHolder.IVDesc.setImageResource(R.id.my_country_name);
return convertView;
}
已经移动了语义支持。因此,当我向向量添加命名的临时实例时,我可以使用std::vector<T>::push_back()
。
STL的其他常见地方我应该养成添加std::move()
的习惯
答案 0 :(得分:2)
我知道
std::vector<T>::push_back()
已经移动了语义支持。
push_back
所拥有的支持只是一个额外的重载,它带有右值引用,因此可以通过调用{{}来构造向量中的新值T
。 1}}而不是T(T&&)
。优点是前者可以更有效地实现,因为它假定传递的右值引用以后永远不会被使用。
大多数标准库容器都为其push / enqueue / insert成员函数添加了类似的重载。此外,安置的概念已添加(例如T(const T&)
),其中值在容器内部构造,以避免不必要的临时值。安置应该优先插入/推动。
因此,当我向矢量添加命名的临时实例时,我可以使用
std::vector<T>::emplace_back
。
“命名为临时”并没有多大意义。这个想法是你有一个你不再关心的左值,你想通过std::move()
把它变成一个临时的。例如:
std::move
请记住Foo foo;
some_vector.emplace_back(std::move(foo));
// I'm sure `foo` won't be used from now on
并不特别:它的字面意思是std::move
。
STL中我应该养成添加
static_cast<T&&>
习惯的其他常见地方是什么?
这是一个非常广泛的问题 - 您应该在任何有意义的地方添加std::move
,而不仅仅是在标准库的上下文中。如果你有一个左值,你知道你不会再在特定的代码路径中使用它,并且你想将它传递/存储在某个地方,那么std::move
它。