相关疑难解决方法(0)

什么是复制和交换习语?

这个成语是什么,什么时候应该使用?它解决了哪些问题?当使用C++ 11时,成语是否会改变?

虽然在许多地方已经提到过,但我们没有任何单一的"它是什么"问题和答案,所以在这里.以下是前面提到的地方的部分列表:

c++ c++-faq copy-constructor assignment-operator copy-and-swap

1907
推荐指数
5
解决办法
34万
查看次数

为什么vector <bool> :: reference不会返回对bool的引用?

#include <vector>

struct A
{
    void foo(){}
};

template< typename T >
void callIfToggled( bool v1, bool &v2, T & t )
{
    if ( v1 != v2 )
    {
        v2 = v1;
        t.foo();
    }
}

int main()
{
    std::vector< bool > v= { false, true, false };

    const bool f = false;
    A a;

    callIfToggled( f, v[0], a );
    callIfToggled( f, v[1], a );
    callIfToggled( f, v[2], a );
}
Run Code Online (Sandbox Code Playgroud)

上面示例的编译会产生下一个错误:

dk2.cpp: In function 'int main()':
dk2.cpp:29:28: error: no …
Run Code Online (Sandbox Code Playgroud)

c++ compiler-errors g++

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

Range-for-loops和std :: vector <bool>

为什么这段代码有效

std::vector<int> intVector(10);
for(auto& i : intVector)
    std::cout << i;
Run Code Online (Sandbox Code Playgroud)

这不是吗?

std::vector<bool> boolVector(10);
for(auto& i : boolVector)
    std::cout << i;
Run Code Online (Sandbox Code Playgroud)

在后一种情况下,我收到一个错误

错误:从'std :: _ Bit_iterator :: reference {aka std :: _ Bit_reference}'类型的右值开始,无效初始化'std :: _ Bit_reference&'类型的非const引用

for(auto& i : boolVector)
Run Code Online (Sandbox Code Playgroud)

c++ for-loop range auto c++11

34
推荐指数
3
解决办法
3457
查看次数

像在python中一样迭代C++

我想在一组值上迭代C++.在python中,它看起来像

for v in [v1, v2, v3]:
    do_something()
Run Code Online (Sandbox Code Playgroud)

在C++中使用它的正确方法是什么?

c++ python loops

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

布尔值向量的基于范围的 for 循环

std::vector<bool> 使用代理迭代器。

因此,以下代码将无法编译(代码取自相关问题中已接受的答案):

vector<bool> v = {true, false, false, true};
for (auto& x : v)
    x = !x;
Run Code Online (Sandbox Code Playgroud)

在相关问题中,已接受的答案指出,要就地修改向量的分量,我们必须使用

for (auto&& x : v)
    x = !x;
Run Code Online (Sandbox Code Playgroud)

但如果我只是这样做:

for (auto x : v)
    x = !x;
Run Code Online (Sandbox Code Playgroud)

这会产生相同的结果。那么&&不需要吗?

进一步为什么以下2个代码不修改组件?

for (bool &&x : v)
    x = !x;
Run Code Online (Sandbox Code Playgroud)

for (bool x : v)
    x = !x;
Run Code Online (Sandbox Code Playgroud)

c++ for-loop boolean vector

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

每个循环的 C++ 向量不会迭代引用?

昨天我花了差不多一个时间来调试这个东西,从那时起我就无法停止思考它。C

我尝试实现带有字符串索引的二维矩阵......

class CSqrMatrix(){
  ....
  void insert(string str){
     bool b = map.insert(str,m_size).second;
     if (b){
         m_size++;
         vector<int> ve;
         for (int i = 0; i < m_vect.size(); i++) 
             ve.push_back(m_default);
         m_vect.push_back(ve);
         for (auto v : m_vect)
             v.push_back(m_default);
     }
  ...
map<string,int> map;
vector < vector<int> > m_vect;
int m_default;
int m_size;
};
Run Code Online (Sandbox Code Playgroud)

经过一些插入后,当我尝试到达类似的元素时

m_vect[0][0] = 8;
Run Code Online (Sandbox Code Playgroud)

我遇到了无效的写入和段错误...并且 的值为m_vect[0].size()0;我尝试了一切,最后我将 for every 循环更改为普通循环,例如

for (int i = 0; i < m_vect.size(); i++){
     m_vect[i].push_back(m_default);
Run Code Online (Sandbox Code Playgroud)

该程序运行良好...

那么这是否意味着,这v不是引用,而是元素的新副本?

谢谢(代码可能有错别字,我是在手机上写的……)

c++ foreach reference vector pass-by-reference

3
推荐指数
1
解决办法
3231
查看次数

为什么在C++ 11的基于范围的情况下需要按值捕获

以下是基于C++范围的循环的示例,该循环按值捕获元素

vector<int> v = {1, 3, 5, 7, 9};

for (auto x : v)
    cout << x << ' ';
Run Code Online (Sandbox Code Playgroud)

更多 内容使用C++ 11基于范围的正确方法是什么?


我的问题

为什么甚至允许按价值捕获?这只是令人困惑和容易出错.如果弄错了,你会花很多钱.我无法想象任何无法通过显式创建副本而不是为您执行循环而无法解决的问题.有什么具体原因吗?我在这里错过了什么吗?

编辑

是的我知道函数允许传递值,但这对它有明显的好处.我要问的是,在for循环中是否有任何使用按值捕获的用法.我现在可以看到,这可以是bools和chars的有用序列.

c++ c++11

0
推荐指数
1
解决办法
177
查看次数

如何访问存储在向量中的对象的成员?

给出问题的代码如下.我已经评论了哪些部分提供了正确的输出,哪些没有,但我不知道为什么,以及我应该如何正常访问类成员数据.我读到尝试在C风格循环中访问并不是很好,但我尝试使用迭代器只能遇到"错误:不匹配'运算符<='(操作数类型是'播放器'和'__gnu_cxx :: __ normal_iterator>')"

class Player
{
public:
    Player() {}
    Player(double strength) {}
    virtual ~Player() {}
    double GetStrength() const {
        return Strength;
    }
    void SetStrength(double val){
        Strength = val;
    }
    int GetRanking() const{
        return Ranking;
    }
    void SetRanking(int val){
        Ranking = val;
    }
    int GetATPPoints() const{
        return ATPPoints;
    }
    void SetATPPoints(int val){
        ATPPoints = val;
    }
protected:
private:
    double Strength; //!< Member variable "Strength"
    int Ranking; //!< Member variable "Ranking"
    int ATPPoints; //!< Member variable "ATPPoints"
};

int main()
{ …
Run Code Online (Sandbox Code Playgroud)

c++ stl vector

-1
推荐指数
1
解决办法
80
查看次数