C++11 向量的数据方法有一些错误 我使用C++中的矢量数据方法,但是我遇到了一些问题,代码是在Bels:< /P> #include <iostream> #include <vector> int main () { std::vector<int> myvector (5); int* p = myvector.data(); *p = 10; ++p; *p = 20; p[2] = 100; std::cout << "myvector contains:"; for (unsigned i=0; i<myvector.size(); ++i) std::cout << ' ' << myvector[i]; std::cout << '\n'; return 0; } #包括 #包括 int main() { std::vector myvector(5); int*p=myvector.data(); *p=10; ++p; *p=20; p[2]=100; std::cout

C++11 向量的数据方法有一些错误 我使用C++中的矢量数据方法,但是我遇到了一些问题,代码是在Bels:< /P> #include <iostream> #include <vector> int main () { std::vector<int> myvector (5); int* p = myvector.data(); *p = 10; ++p; *p = 20; p[2] = 100; std::cout << "myvector contains:"; for (unsigned i=0; i<myvector.size(); ++i) std::cout << ' ' << myvector[i]; std::cout << '\n'; return 0; } #包括 #包括 int main() { std::vector myvector(5); int*p=myvector.data(); *p=10; ++p; *p=20; p[2]=100; std::cout,c++11,C++11,,因为您正在修改p本身 在++p(我记得你说过这相当于p=p+1)之后,p指向索引1处的元素,因此p[2]从向量的开头指向索引3处的元素,这就是为什么第四个元素被更改的原因。因为您正在修改p本身 在++p(我记得你说过这相当于p=p+1)之后,p指向索引1处的元素,因此p[2]从向量的开头指向索引3处的元素,这就是为什么第四个元素被更改的原因。在++p之后,指针p指向myvector[1] 然后我们有: p[0]指向myvector[1] p[1]指向myvector[2] p[2]指向myv

,因为您正在修改
p
本身


++p
(我记得你说过这相当于
p=p+1
)之后,
p
指向索引
1
处的元素,因此
p[2]
从向量的开头指向索引
3
处的元素,这就是为什么第四个元素被更改的原因。

因为您正在修改
p
本身


++p
(我记得你说过这相当于
p=p+1
)之后,
p
指向索引
1
处的元素,因此
p[2]
从向量的开头指向索引
3
处的元素,这就是为什么第四个元素被更改的原因。

++p
之后,指针
p
指向myvector[1]

然后我们有:

  • p[0]
    指向
    myvector[1]
  • p[1]
    指向
    myvector[2]
  • p[2]
    指向
    myvector[3]

    • ++p
      之后,指针
      p
      指向myvector[1]

      然后我们有:

      • p[0]
        指向
        myvector[1]
      • p[1]
        指向
        myvector[2]
      • p[2]
        指向
        myvector[3]
      具有视觉效果:

      std::vector myvector(5);
      //   ---------------------
      //   | 0 | 0 | 0 | 0 | 0 |
      //   ---------------------
      int*p=myvector.data();
      //   ---------------------
      //   | 0 | 0 | 0 | 0 | 0 |
      //   ---------------------
      //     ^
      //p
      *p=10;
      //   ----------------------
      //   | 10 | 0 | 0 | 0 | 0 |
      //   ----------------------
      //     ^
      //p
      ++p;
      //   ----------------------
      //   | 10 | 0 | 0 | 0 | 0 |
      //   ----------------------
      //          ^
      //p
      *p=20;
      //   ----------------------
      //   | 10 | 20 | 0 | 0 | 0 |
      //   ----------------------
      //          ^
      //p
      p[2]=100;
      //   -------------------------
      //   | 10 | 20 | 0 | 100 | 0 |
      //   -------------------------
      //          ^         ^
      //p[2]
      
      记住
      p[2]
      是用视觉符号表示
      *(p+2)

      的一种较短方式,这很有帮助:

      std::vector myvector(5);
      //   ---------------------
      //   | 0 | 0 | 0 | 0 | 0 |
      //   ---------------------
      int*p=myvector.data();
      //   ---------------------
      //   | 0 | 0 | 0 | 0 | 0 |
      //   ---------------------
      //     ^
      //p
      *p=10;
      //   ----------------------
      //   | 10 | 0 | 0 | 0 | 0 |
      //   ----------------------
      //     ^
      //p
      ++p;
      //   ----------------------
      //   | 10 | 0 | 0 | 0 | 0 |
      //   ----------------------
      //          ^
      //p
      *p=20;
      //   ----------------------
      //   | 10 | 20 | 0 | 0 | 0 |
      //   ----------------------
      //          ^
      //p
      p[2]=100;
      //   -------------------------
      //   | 10 | 20 | 0 | 100 | 0 |
      //   -------------------------
      //          ^         ^
      //p[2]
      

      记住
      p[2]
      是说
      *(p+2)

      是的,唐纳德·克努特的风格。是的,唐纳德·克努特的风格。