【问题标题】:Equivalent of python list multiplying with a scale in c++ [duplicate]相当于python列表乘以c ++中的比例[重复]
【发布时间】:2022-01-17 09:26:57
【问题描述】:

你会如何在 c++ 中编写列表乘以比例的代码?

在 python 中我会这样做:

lst = [1,2,3]
lst*3 # we will get [1,2,3,1,2,3,1,2,3]

c++ 的等价物是什么?

【问题讨论】:

标签: python c++


【解决方案1】:

如果你真的需要乘法运算,比如你正在开发一些数学库,你可以考虑operator overloading。否则,我建议您在使用 C++ 时放弃 python 样式,只需使用 std::copyvector::insert 和循环将重复元素插入向量中。

std::vector<int>& operator*(std::vector<int>& vec, std::size_t n) {
    auto initSize = vec.size();
    for (std::size_t i = 0; i < n - 1; ++i) {
        vec.insert(vec.end(), vec.begin() + initSize * i, vec.end());
    }
    return vec;
}

// commutative principle for multiplication
std::vector<int>& operator*(std::size_t n, std::vector<int>& vec) {
    return operator*(vec, n);
}

int main()
{
    std::vector<int> vec {1, 2, 3};
    vec = vec * 3; // 3 * vec is OK too

    for (auto val : vec) {
        std::cout << val << ' ';
    }

    return 0;
}

【讨论】:

  • 我真的不鼓励这样做,因为不清楚vec * 3 对普通程序员意味着什么。我的第一个猜测是元素向量乘法。这样做会导致很多歧义。一个更好的选择是只创建一个命名函数并调用它:vec = repeat(vec, 3)
  • @TedKleinBergman 我同意你的看法。
  • 这并不常见。如果您发现它很常见,请编写一个接受序列并附加 n 次的函数。 (可能有一个 C++20 范围单行……)
  • @Ben C++ 委员会有各种背景非常不同的专家,很难说“这并不常见”。以我的技术背景,我想说:我们应该从 C++ 标准中完全删除运算符重载。
  • 好的。我认为您可能想要的通用算法是template &lt;typename Range, typename OutIter&gt; OutIter copy_n_times(const Range&amp;, OutIter out, std::size_t n) { OutIter result = out; for (std::size_t i = 0; i != n; ++i) { result = std::copy(range.begin(); range.end(), result); } return result; }
猜你喜欢
  • 2012-04-07
  • 2022-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-10
  • 2013-09-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多