相关疑难解决方法(0)

何时使用std :: begin和std :: end而不是容器特定版本

有没有到底应该用来代替自由函数来解释,当容器开始和特定版本的任何一般的偏好或规则std::beginstd::end

这是我的理解是,如果该函数是一个模板,其中容器类型是模板参数则std::beginstd::end应使用,即:

template<class T> void do_stuff( const T& t )
{
    std::for_each( std::begin(t), std::end(t), /* some stuff */ );
}
Run Code Online (Sandbox Code Playgroud)

在其他场景中,例如已知容器类型的标准/成员函数呢?它仍然是更好的做法是使用std::begin(cont)std::end(cont)或应容器的成员函数cont.begin()cont.end()首选?

我在假设有通过调用在性能上没有任何好处纠正cont.end()std::end(cont)

c++ c++11

89
推荐指数
3
解决办法
2万
查看次数

不能在数组上使用.begin()或.end()

错误如下:

请求'arr'中的成员'begin','end'是非类型int [5],无法从表达式错误中推断出来.

我的代码:

#include <iostream>
using namespace std;

int main()
{
    int * mypointer;

    int arr[5] = {1,3,5,7,9};

    mypointer = arr;

    for(auto it = arr.begin(); it != arr.end(); ++it) {
        cout<<*mypointer<<endl;

        mypointer++;
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c++ arrays pointers iterator c++11

25
推荐指数
2
解决办法
4万
查看次数

vector :: begin()和std :: begin()之间的区别

在c ++中迭代一个向量时,我注意到begin()标准库中有一个函数,还有一个begin()作为类的成员函数vector.如果有的话,两者之间的区别是什么,哪一个应该用于另一个?

例:

vector<int> numbers;
//Code to put values in my vector
for (vector<int>::iterator i = numbers.begin(); i < numbers.end(); i++)
    cout << *i << '\n';
Run Code Online (Sandbox Code Playgroud)

VS:

vector<int> numbers;
//Code to put values in my vector
for (vector<int>::iterator i = std::begin(numbers); i < std::end(numbers); i++)
    cout << *i << '\n';
Run Code Online (Sandbox Code Playgroud)

c++ vector

19
推荐指数
2
解决办法
4863
查看次数

暴露自定义STL样式迭代的首选方法是什么?

(另请参阅是否有一种很好的方法可以在C++中为自定义类型手写所有12个所需的Container函数?)


对于像这样的课程

namespace JDanielSmith {
class C
{
    const size_t _size;
    const std::unique_ptr<int[]> _data;

public:
    C(size_t size) : _size(size), _data(new int[size]) {}

    inline const int* get() const noexcept { return _data.get(); }
    inline int* get() noexcept { return _data.get(); }

    size_t size() const noexcept { return _size; }
};
}
Run Code Online (Sandbox Code Playgroud)

暴露迭代的首选方式是什么?我应该写begin()/ end()(和cbegin()/ cend())成员函数吗?

const int* cbegin() const {
    return get();
}
const int* cend() const {
    return cbegin() + size();
}
Run Code Online (Sandbox Code Playgroud)

或者这些应该是非会员职能? …

c++ iterator stl

8
推荐指数
2
解决办法
687
查看次数

用于SoA/AoS内存布局的C++零成本抽象

假设我有一个使用Array of Structures(AoS)内存布局的大代码.我想在C++中构建一个零成本的抽象,它允许我在尽可能少的重构努力之间切换AoS和SoA.例如,使用具有访问成员函数的类

 struct Item{
   auto& myDouble(){ return mDouble; }
   auto& myChar(){ return mChar; }
   auto& myString(){ return mString; }
 private:
   double mDouble;
   char mChar;
   std::string mString;
 };
Run Code Online (Sandbox Code Playgroud)

它在循环中的容器内使用

std::vector<Item> vec_(1000);
for (auto& i : vec_)
  i.myDouble()=5.;
Run Code Online (Sandbox Code Playgroud)

我想改变第一个片段,而第二个片段保持相似...例如,有类似的东西

MyContainer<Item, SoA> vec_(1000)
for (auto& i : vec_)
  i.myDouble()=5.;
Run Code Online (Sandbox Code Playgroud)

我可以使用"SoA"或"AoS"模板参数选择内存布局.我的问题是:这样的事情存在于某个地方吗?如果没有,最好如何实施?

c++ abstraction design-patterns data-oriented-design template-meta-programming

5
推荐指数
1
解决办法
1132
查看次数

为什么通用编程设计更喜欢免费功能而不是成员函数?

我最近介绍了通用编程库的设计,如STL,boost :: graph,boost PropertyMaps http://www.boost.org/doc/libs/1_54_0/libs/property_map/doc/property_map.html

使用像get(PropertyMap,key)这样的自由函数而不是像PropertyMap.get(key)这样的成员函数的原理是什么?

我知道这些函数的最通用形式是在"boost"命名空间中定义的.假设我在命名空间"project"中定义了一个新的PropertyMap,定义它的相应"get"函数的最佳位置是什么?"提升"或"项目"

c++ generics boost

4
推荐指数
1
解决办法
654
查看次数

如何使用begin()自由函数

我目前正在编写一个处理通用容器的函数模板.我想用std::begin()std::end(),因上述原因在这一问题.我的问题是,我是否应该使用:

std::begin( myContainer )
Run Code Online (Sandbox Code Playgroud)

要么:

using namespace std; // Better use: "using std::begin"
begin( myContainer )
Run Code Online (Sandbox Code Playgroud)

或者,换句话说,是否可以begin()std命名空间内重载?我是否应该允许我的函数用户其他地方重载全局命名空间中begin()函数?STL如何处理它?

c++ templates stl generic-programming c++11

2
推荐指数
1
解决办法
968
查看次数

c ++ 14 - vec.begin()和begin(vec)之间有什么区别吗

在这个问题(/sf/ask/484850341/)中,user703016使用以下语法来访问vector cards_的迭代器:

对于C++ 98,他们建议使用:cards_.begin()和cards_.end()

对于C++ 11,他们建议使用:std :: begin(cards_)和std :: end(cards_)

对于C++ 14,哪种语法更可取,两者之间是否有任何真正的区别?在今天之前,我只看到了第一种语法.

c++ syntax iterator c++11 c++14

2
推荐指数
1
解决办法
91
查看次数