如何用向量表示圆

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何用向量表示圆相关的知识,希望对你有一定的参考价值。

参考技术A |OA|=|OB|=|OC|=|OD| 即是四个向量的模相等
则A、B、C、D在以O为圆心的圆上。追问

问得不是四点共圆

如何用非平凡的初始值填充向量?

【中文标题】如何用非平凡的初始值填充向量?【英文标题】:How to fill a vector with non-trivial initial values? 【发布时间】:2008-10-16 08:25:41 【问题描述】:

我知道如何用非平凡的初始值填充 std::vector,例如序号:

void IndexArray( unsigned int length, std::vector<unsigned int>& v )

    v.resize(length);
    for ( unsigned int i = 0; i < length; ++i )
    
        v[i] = i;
    

但这是一个 for 循环。有没有一种优雅的方法可以使用 stl 功能(并且使用 Boost)减少代码行数?

【问题讨论】:

【参考方案1】:

您可以使用 generate 算法来获得更通用的填充容器的方法:

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

struct c_unique 
   int current;
   c_unique() current=0;
   int operator()() return ++current;
 UniqueNumber;


int main () 
  vector<int> myvector (8);
  generate (myvector.begin(), myvector.end(), UniqueNumber);

  cout << "\nmyvector contains:";
  for (vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
    cout << " " << *it;

  cout << endl;

  return 0;

这是从cplusplusreference无耻地提取和编辑的。

【讨论】:

他可能想以 v[i] == i 开头,但稍后在代码中更改。 是的,我希望他能解释一下这个案子。可能有比先填满 em 更好的方法。像一种懒惰的评估方式或其他方式。 我的问题更笼统,因为问题实际上是关于使用非平凡值进行初始化。我确实想用索引号填充数组,以便以后能够排列它们。可能还会有其他解决方案。 正确,已删除问题。也许您可以发布该排列问题?解决方案可能很有趣:) @moog 注意:generate 可能会制作一个 copy 或您提供的函数的副本,此代码可能会生成序列“1 1 1 1 ..”。相反,使用 tr1::ref 传递引用 UniqueNumber 的引用包装器,以避免复制: generate(.. tr1::ref(UniqueNumber) );【参考方案2】:

我通常使用std::generate 加上一个简单的生成器:

template <typename T>
struct gen 
    T x;
    gen(T seed) : x(seed)  

    T operator ()()  return x++; 
;

generate(a.begin(), a.end(), gen<int>(0));

【讨论】:

【参考方案3】:

如果您使用的是 SGI STL(或衍生产品,例如 STLPort),您可以使用iota。 :-)

void IndexArray(unsigned int length, vector<unsigned int>& v)

    vector<unsigned int>(length).swap(v);
    iota(v.begin(), v.end(), 0);

【讨论】:

c++11中也有【参考方案4】:

adobe.ASL 中还有一个 iota() 函数(还有一个 value_iterator)。 在 boost 中,有一个 counting_iterator,我怀疑还有其他一些方法可以在 boost 中动态生成数字序列。

【讨论】:

【参考方案5】:

我知道这已经得到解答,但我更喜欢算法库中的“填充”功能,因为它对我来说阅读起来更直观:

// fill algorithm example
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int main () 
  vector<int> myvector (8);                       // myvector: 0 0 0 0 0 0 0 0

  fill (myvector.begin(),myvector.begin()+4,5);   // myvector: 5 5 5 5 0 0 0 0
  fill (myvector.begin()+3,myvector.end()-2,8);   // myvector: 5 5 5 8 8 8 0 0

  cout << "myvector contains:";
  for (vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
    cout << " " << *it;

  cout << endl;

  return 0;

这也被cplusplusreference无耻地解除了。

【讨论】:

您将如何使用它来按照要求用渐进式数字填充向量?【参考方案6】:

如果你有一个 C 风格的数组,你可以使用 std:copy,例如,

int c_array[] = 3,4,5;

const int* pbegin = &c_array[0];
const size_t c_array_size = sizeof(c_array) / sizeof(c_array[0]);
const int* pend  = pbegin + c_array_size;

std::vector<int> v;
v.reserve(c_array_size);
std::copy(pbegin, pend, std:back_inserter(v));

【讨论】:

以上是关于如何用向量表示圆的主要内容,如果未能解决你的问题,请参考以下文章

如何用MATLAB将特征向量标准化

怎么比较两个向量组相似度

如何用向量证ABCD共面?

如何用单位圆解三角不等式

如何用matlab中的mesh和surf函数画圆

如何用因子和向量构建函数