我有两个常量向量:
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 );
}
}
如何指向向量A
或B
以及如何声明myVector
?
答案 0 :(得分:5)
您可以使用参考:
auto& myVector = somethingHappens ? A : B;
while ( a condition ) {
do something with ( myVector );
}
现在myVector
是A
或B
的“新名称”,具体取决于您的情况。
答案 1 :(得分:3)
作为最简单的解决方案,您可以使用副本:
int main() {
vector<int> myVector;
if ( /* something happens */ )
myVector = A;
else
myVector = B;
// ...
}
由于您无论如何都无法更改A
或B
中的值,因此不会产生太大影响。
如果你担心复制开销,你也可以使用指针:
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 );