C ++向量指针:指向变量指针的常量向量?

时间:2015-04-11 13:21:58

标签: c++ pointers vector

我有两个常量向量:

const vector<int> A = { 0, 12, 23, 34, 45, 56, 67, 78, 89 };
const vector<int> B = { 13, 24, 35, 46, 57, 68, 79 };

我希望像这样切换它们

int main()
{
  vector<int> myVector;

  if ( something happens )
    point myVector to A;
  else
    point myVector to B;

  while ( a condition )
  {
    do something with ( myVector );
  }
}

如何指向向量AB以及如何声明myVector

4 个答案:

答案 0 :(得分:5)

您可以使用参考:

auto& myVector = somethingHappens ? A : B;
while ( a condition ) {
    do something with ( myVector );
}

现在myVectorAB的“新名称”,具体取决于您的情况。

答案 1 :(得分:3)

作为最简单的解决方案,您可以使用副本:

int main() {
  vector<int> myVector;

  if ( /* something happens */ )
    myVector = A;
  else
    myVector = B;

  // ...
}

由于您无论如何都无法更改AB中的值,因此不会产生太大影响。

如果你担心复制开销,你也可以使用指针:

int main() {
  const vector<int>* myVector = nullptr;

  if ( /* something happens */ )
    myVector = &A;
  else
    myVector = &B;

  // ...
}

但根据 something_happens do_something_with(myVector); 的实际情况,可能会有其他解决方案,显得更优雅,或者可以在编译时间。

答案 2 :(得分:2)

这是另一种选择:

bool condition = /* evaluate something happens */;

while (a_condition)
{
    do_something_with(condition ? A : B);
}

答案 3 :(得分:1)

如果条件是紧凑的,您可以声明一个引用并使用条件运算符中的条件对其进行初始化。例如

std::vector<int> &v = ( A < B ? B : A );

否则您可以使用std::reference_wrapper。例如

#include <iostream>
#include <vector>
#include <functional>
#include <algorithm>

int main() 
{
    const std::vector<int> A = { 0, 12, 23, 34, 45, 56, 67, 78, 89 };
    const std::vector<int> B = { 13, 24, 35, 46, 57, 68, 79 };

    auto v = std::cref( std::max( A, B ) );

    for ( int x : v.get() ) std::cout << x << ' ';
    std::cout << std::endl;

    return 0;
}

输出

13 24 35 46 57 68 79 

或者您可以首先将reference_wrapper初始化为一个向量,然后重新分配它。例如

auto p = std::cref( A );
if ( condition ) p = B;

还要考虑到初始化引用时可以在条件运算符中使用lambda表达式作为条件。所以情况可能是复合的。

std::vector<int> &v = ( [] { /* compound lambda */ }() ? B : A );