如何在 c++ 中优雅地返回特定的矢量元素

How do I return specific vector elements in c++ elegantly

提问人:shaan 提问时间:1/31/2023 更新时间:1/31/2023 访问量:197

问:

我正在处理一个问题,在这个问题上,我必须返回一个类型向量。我知道向量的大小正好是两个。有没有办法以向量形式返回我的值,而无需创建新的向量变量并返回它?

我尝试了以下方法,但没有奏效。以及卷曲牙套和直牙套。

vector<int> foo()
{
    return <1,2>;
}
C++ 矢量 标准

评论

3赞 tadman 1/31/2023
这表明你随机尝试了一些东西,这是学习C++的一种非常困难的方法。随时随身携带参考资料。如果这是您要返回的内容,请尝试创建另一个。C++不能也不会读懂你的想法。std::vector
0赞 tadman 1/31/2023
您也可以考虑或此处。std::pairstd::tuple
3赞 NathanOliver 1/31/2023
如果我认为您要问的是如何在不创建变量的情况下返回向量,那么您需要return {element_1, element_2};
1赞 Peter 1/31/2023
return <1,2>是无效的语法。如果使用 C++ 11 及更高版本可以工作,但如果在 C++ 11 之前为 C++ 标准构建,则不起作用。在 C++11 之前,不可能只用一个语句创建和初始化一个 2 元素 - 你需要做类似的事情(即创建一个命名向量,显式设置其元素,然后返回它)。return {1,2}std::vectorstd::vector<int> temp; temp.push_back(1); temp.push_back(2); return temp;
0赞 user12002570 1/31/2023
您按值返回,根据定义,这涉及复制。

答:

0赞 user12002570 1/31/2023 #1

有没有办法以向量形式返回我的值,而无需创建新的向量变量并返回它?

您已经按值返回,根据定义,该涉及副本。如果要避免复制,可以尝试通过引用返回。


现在,使用 C++11 及更高版本,我们应该用大括号替换尖括号,如下所示:<>{}

//vvvvvvvvvvv------------------>You're returning by value!
  vector<int> foo()
  {
//---------vvvvv------------->changed <> to {}
    return {1,2};
  }

评论

0赞 Nathan Pierson 1/31/2023
“根据定义,这涉及副本”。嗯,不完全是,对吧?这个特定的副本已经被省略了一段时间,因为 C++17 必须被省略。
0赞 user12002570 1/31/2023
@NathanPierson 尽管 C++17 中强制删除了复制,但它仍然属于“复制初始化”的范畴。在 C++17 之前,是否执行优化取决于编译器。此外,通过阅读 OP 的问题,他似乎没有使用现代 c++(从 c++11 开始),所以我的回答牢记(c++11/c++14)。另请注意,从技术上讲,在 C++17 中,首先没有要省略的副本!
1赞 Max He 1/31/2023 #2

如果您使用 C++11 或更高版本,只需编写:

vector<int> foo()
{
    return {1,2};
}

{1, 2}将被推断为initializer_list,它不会导致复制,因为我们有“复制省略”。因为它没有名称,因此也称为“返回值优化”。

您可以在以下位置看到:https://en.cppreference.com/w/cpp/language/copy_elision https://en.cppreference.com/w/cpp/utility/initializer_list